不创建临时变量交换数组元素

本文探讨了不借助临时变量进行数组交换的三种方法:异或运算、加法和乘法,介绍了它们的优缺点,特别强调了异或运算在避免溢出上的优势,但同时也提到了其在特定条件下(相同索引)的局限性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先讲讲交换数组的常规写法:

创建临时变量交换数组元素

function swap(nums, a, b) {
  const temp = nums[a];
  nums[a] = nums[b];
  nums[b] = temp;
}
const list = [1,2,3,4];

swap(list, 0, 3);
console.log(list); // [4,2,3,1]

那能不能不创建临时变量去交换数组呢?

有如下方法

  • 异或(^)
  • 加减
  • 乘除

下面分别讲一讲他们的优劣

异或运算符

function swap(nums, a, b) {
  nums[a] ^= nums[b]; // nums[a] = nums[a] ^ nums[b]
  nums[b] ^= nums[a]; // nums[b] = nums[b] ^ nums[a] = nums[b] ^ (nums[a] ^ nums[b]) = nums[a] ^ (nums[b] ^ nums[b]) = nums[a] ^ 0 = nums[a]
  nums[a] ^= nums[b]; // nums[a] = nums[a] ^ nums[b] = (nums[a] ^ nums[b]) ^ (nums[a]) = nums[b] ^ (nums[a] ^ nums[a]) = nums[b] ^ 0 = nums[b]
}

优势:不用临时变量直接交换了数组两个元素
劣势:交换相同变量得到的结果为 0,因为 a ^ a = 0。 如下

let arr = [1, 2];
let i = 0;
let j = 0;

swap(arr, i, j);

console.log(arr); // [0, 2]

很明显 arr 第一个元素不对了,原因 a ^ a = 0 导致的。

加法运算符

function swap(nums, a, b) {
  nums[a] = nums[a] + nums[b];
  nums[b] = nums[a] - nums[b];
  nums[a] = nums[a] - nums[b];
}

优势:不用临时变量直接交换了数组两个元素
劣势:交换相同变量得到的结果为 0;两数相加可能数值溢出;

乘法运算符

function swap(nums, a, b) {
  nums[a] = nums[a] * nums[b];
  nums[b] = nums[a] / nums[b];
  nums[a] = nums[a] / nums[b];
}

优势:不用临时变量直接交换了数组两个元素
劣势:交换相同变量得到的结果为 1;两数相乘可能数值溢出;

总结

看好异或运算,加法和乘法都会造成溢出问题。
对于相同索引的数组交换添加条件判断,如下:

function swap(nums, a, b) {
  if(a === b) return;
  
  nums[a] ^= nums[b];
  nums[b] ^= nums[a];
  nums[a] ^= nums[b];
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值