LuckyWinty / fe-weekly-questions

A pro to record some interview questions every week...
MIT License
341 stars 34 forks source link

不借助变量,交换两个数。 #51

Open LuckyWinty opened 4 years ago

LuckyWinty commented 4 years ago

function swap(a, b) { //TODO }

LuckyWinty commented 4 years ago

1. 算术交换

针对的是Number,或者类型可以转换成数字的变量类型

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

通过算术运算过程中的技巧,可以巧妙地将两个值进行互换。但是,有个缺点就是变量数据溢出。因为JavaScript能存储数字的精度范围是 -2^53 到 2^53。所以,加法运算,会存在溢出的问题。

2. 异或运算

^ 按位异或 若参加运算的两个二进制位值相同则为0,否则为1 此算法能够实现是由异或运算的特点决定的,通过异或运算能够使数据中的某些位翻转,其他位不变。这就意味着任意一个数与任意一个给定的值连续异或两次,值不变.

a = a ^ b;
b = a ^ b; 
a = a ^ b;

3. ES6的解构

[a, b] = [b, a];

更多参考:

maqinghao commented 4 years ago

ES6结构,应该是最好的吧

55cc commented 4 years ago

你借助了变量a和b

chenLe1232 commented 3 years ago

你借助了变量a和b

我竟无言以对