23

面试官在“逗”你系列:不借助第三变量交换两个变量值的方案你有几种?

 4 years ago
source link: http://www.cnblogs.com/justbecoder/p/12702624.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

引言

在我们学习编程之初,就学习过变量的赋值操作,同时也学习了将一个变量的值赋值给另外一个变量。对于交换两个变量的值,很多童鞋都有解决方案。然鹅,对于面试官提出的不借助第三变量来交换两个变量的值,你能想到几种解决方案呢?

如果你只知道一种方案,请你认真看下去...

如果你知道两种方案,那么你可以来了解更多方案了...

一、最简单的实现-最初的记忆

让我们由浅入深,来了解交换变量值的最简单、最初的解决方案:借助于第三个变量

// 声明变量a和b
let a = 5
let b = 4
// 1. 临时将变量a的值赋值给变量tmp
let tmp = a
// 2. 将变量b的值赋值给a
a = b
// 3. 将变量a的值(tmp的值)赋值给b
b = tmp

console.log(a) // 4
console.log(b) // 5

so east!

二、不借助第三变量的实现-ES6版

面试官在听到上面给出的解决方案后,微微一笑(脑海中闪现到:你以为就这么简单)说道,有其他解决方案吗,不借助第三变量呢?

了解学习了JS ES6的数组解构赋值的童鞋对此冷冷一笑,嘴角一撇,冷酷酷地说道:也可以使用ES6的数组解构赋值来交换变量的值。

let a = 5;
let b = 4; // 请注意此位置的分号;是一定要存在的呀

// 数组结构赋值,交换变量a,b的值
[a, b] = [b, a]

console.log(a) // 4
console.log(b) // 5

看到面试官的脸色似乎渐渐露出了满意的神色,内心是不是有点儿窃喜。

如果此刻面试官又说道,还有没有其他的解决方案,小朋友,你是不是有许多问号?

三、不借助第三变量的实现-终极版本一:单纯数学运算

胡哥在这里再次强调,这绝对不是一个考验“智商”的答案,只是考验了在编程的变通能力以及经验问题,下面请看代码的实现。

let a = 5
let b = 4

// 接下来就是见证神奇的时刻,来,镜头请对准我。

// 二者之和
a = a + b
// 二者之和 - b的值,剩余a的值赋值给变量b
b = a - b
// 此刻a还是二者之和,a - b此刻相当于二者之和 - 变量b(a的值),那么此刻剩余的就是变量b的值,赋值给a变量
a = a - b

// yes, we did!
console.log(a) // 4
console.log(b) // 5

如果此刻面试官再问出还有没有其他的方案,此刻你会慌的一比呢,还是内心大喊“wc”呢

四、不借助第三变量的实现-终极版本二:位运算符^

不要怕,兄弟们,接下来给大家来分享第四种方式,位运算符 ^ 异或。在变量的运算中这个操作符有什么作用呢?

异或运算符:

是执行位运算的,二进制运算,参与变量运算的两个变量要转为二进制进行运算。
如果相同二进制位的值相同,则转为0,否则转为1.

那交换两个变量的值具体代码是如何实现的呢?请看大屏幕,哦,不,请往下看。

let a = 5 // 0101
let b = 4 // 0100

// 按位异或运算
a = a ^ b // 0101 ^ 0100 ===> 0001,此时a的值为1
b = a ^ b // 0001 ^ 0100 ===> 0101,此时b的值为5
a = a ^ b // 0001 ^ 0101 ===> 0100,此时a的值为4

console.log(a) // 4
console.log(b) // 5

惊不惊喜,意不意外。。。

以上四种实现交换两个变量值得方案你都掌握了吗,如果掌握了,可以对面试官反手就是一个“吊打”了。

如果你有更多的解决交换两个变量值的方案,欢迎留言交流呀!

后记

以上就是胡哥今天给大家分享的内容,喜欢的小伙伴记得 点赞收藏 呦,关注胡哥有话说,学习前端不迷路,欢迎多多留言交流...

胡哥有话说,一个有技术,有情怀的胡哥!现任京东前端攻城狮一枚。

胡哥有话说,专注于大前端技术领域,分享前端系统架构,框架实现原理,最新最高效的技术实践!


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK