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

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

引言


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


如果你只知道一种方案,请你认真看下去... 如果你知道两种方案,那么你可以来了解更多方案了...


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


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


// 声明变量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


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


以上四种实现交换两个变量值得方案你都掌握了吗,如果掌握了,可以对面试官反手就是一个“吊打”了。 如果你有更多的解决交换两个变量值的方案,欢迎留言交流呀!


相关文章
|
3月前
|
消息中间件 网络架构
【面试问题】什么是 MQ topic 交换器(模式匹配) ?
【1月更文挑战第27天】【面试问题】什么是 MQ topic 交换器(模式匹配) ?
|
3月前
面试题 05.07:配对交换
面试题 05.07:配对交换
18 0
|
3月前
|
SQL 数据挖掘 数据处理
「SQL面试题库」 No_46 交换工资
「SQL面试题库」 No_46 交换工资
|
5月前
|
算法
代码随想录算法训练营第四天 | LeetCode 24. 两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题 02.07. 链表相交、142.环形链表II
代码随想录算法训练营第四天 | LeetCode 24. 两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题 02.07. 链表相交、142.环形链表II
141 0
|
5月前
|
存储 算法
代码随想录算法训练营第四天 | 24. 两两交换链表中的节点 ,19.删除链表的倒数第N个节点 ,面试题 02.07. 链表相交 ,142.环形链表II
代码随想录算法训练营第四天 | 24. 两两交换链表中的节点 ,19.删除链表的倒数第N个节点 ,面试题 02.07. 链表相交 ,142.环形链表II
|
6月前
代码随想录Day4 链表基础2 LeetCodeT24 两两交换链表中的节点 LeetCode T19删除链表的倒数第N个节点 LeetCode面试题 链表相交 LeetCode 142 环形链表
代码随想录Day4 链表基础2 LeetCodeT24 两两交换链表中的节点 LeetCode T19删除链表的倒数第N个节点 LeetCode面试题 链表相交 LeetCode 142 环形链表
14 0
|
6月前
|
程序员
【Leetcode】面试题 01.06. 字符串压缩、面试题 05.07. 配对交换
目录 面试题 01.06. 字符串压缩: 面试题 05.07. 配对交换
20 0
|
8月前
|
算法
代码随想录算法训练营第四天| 24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 (面试题) 02.07. 链表相交 142.环形链表II
代码随想录算法训练营第四天| 24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 (面试题) 02.07. 链表相交 142.环形链表II
|
负载均衡 监控 算法
90%的面试官都会问到交换网络里面冗余和破环的STP协议
90%的面试官都会问到交换网络里面冗余和破环的STP协议
184 0
90%的面试官都会问到交换网络里面冗余和破环的STP协议
|
Rust 自然语言处理 算法
【算法】面试题 16.01. 交换数字(多语言实现)
编写一个函数,不用临时变量,直接交换numbers = [a, b]中a与b的值。
【算法】面试题 16.01. 交换数字(多语言实现)