您现在的位置:首页 >> 前端 >> 内容

不借助第三个变量,进行两个整数的交换

时间:2017/8/21 9:33:00 点击:

  核心提示:通常情况下,我们要交换两个数字的顺序,类似冒泡排序,常用的方式是借助第三个变量,如下:function bubbleSort(arr) {for (let i = 0; iarr.length; i+...

通常情况下,我们要交换两个数字的顺序,类似冒泡排序,常用的方式是借助第三个变量,如下:

function bubbleSort(arr) {
    for (let i = 0; i < arr.length; i++) {
        for (let j = i + 1; j < arr.length; j++) {
            if (arr[i] > arr[j]) {
                let temp = arr[i]
                arr[i] = arr[j]
                arr[j] = temp
                }
            }
        }
    return arr
}

那如何不借助第三个变量 呢?请看下面代码:

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

上面的代码可以成功将 a, b 的值交换,不信可以试下。
那是怎么做到的呢?
我目前所了解的有三种解法。

左边是解法 ==> 右边是解释

第一种解法:
b = b - a   ==>  b 相当于 (b - a)
a = a + b   ==>  由上可得 a = a + (b - a) 也就是 a = b
b = a - b   ==>  由上可得 b = b - (b - a) 也就是 b = a
交换成功~

注意:以上右边解释所写的 a 和 b 都是初始的 a 和 b


第二种解法:
与第一种解法一样,都是利用加减法。
b = a + b   ==>  b 相当于 (a + b)
a = b - a   ==>  由上可得 a = (a + b) - a 得到 a = b
b = b - a   ==>  由上可得 b = (a + b) - b 得到 b = a
交换成功~

注意:以上右边解释所写的 a 和 b 都是初始的 a 和 b


第三种解法:
这种解法是使用异或解的,用到的异或的一个重要的知识点就是:
对于一个数,异或另一个数两次最终得到的还是原来的数
a = a ^ b ==>  a 相当于 a ^ b
b = a ^ b ==>  由上可得 b = a ^ b ^ b 得到 b = a
a = a ^ b ==>  由上可得 a = a ^ a ^ b 得到 a = b
交换成功~

注意:以上右边解释所写的 a 和 b 都是初始的 a 和 b

—–我是分隔线—–
这是我的第一篇博客,也是我用Markdown写的第一篇博客,如果有排版不好的地方请多见谅,如果内容有错请一定在评论区给我指点迷津,在下诚惶诚恐。

作者:网络 来源:Nygmas blo