当前位置:网站首页>不创建临时变量交换数组元素
不创建临时变量交换数组元素
2022-07-17 08:10:00 【兰亭古墨】
首先讲讲交换数组的常规写法:
创建临时变量交换数组元素
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];
}
边栏推荐
猜你喜欢

60、wsgiref手写web框架+jinja2模块初识

6-9 vulnerability exploitation telnet login rights lifting

Junit5

STM32CUBEIDE(9)----USART通过DMA收发

scratch逆序输出 电子学会图形化编程scratch等级考试四级真题和答案解析2022年6月

Convex mirror 3D glass contour scanning

1. Decision tree

Openfeign service interface call

trochvision中数据集的使用

Talk about distributed locks
随机推荐
Hand in hand practice a DAPP, the road to Web3.0!
JS learning notes 14-15: JS array and array letter quantity
5.1 安全漏洞与防范
Yyds dry inventory cross origin cross domain request
Li Kou 1669 merges two linked list notes
Gateway新一代网关
Ribbon负载均衡服务调用
STM32CUBEIDE(9)----USART通过DMA收发
搭建嵌入式开发环境
Use torch NN builds the simplest neural network framework
深度学习之线性回归+基础优化
Redis
JS learning notes 09-12: prototype objects, foreach+tostring and recycle bin
matlab导入小数点后9位以上的浮点数
JS学习笔记06-08:数组的遍历以及数组的四个方法
JS学习笔记06-08:数组的遍历以及数组的四个方法
Picture browser
力扣912排序数组笔记
Redis常用数据类型——哈希(Hash)和有序集合 Zset(sorted set)
1. Flask Foundation