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

胡哥有话说
• 阅读 1430

引言

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

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

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

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

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

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

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

后记

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

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

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Easter79 Easter79
2年前
swap空间的增减方法
(1)增大swap空间去激活swap交换区:swapoff v /dev/vg00/lvswap扩展交换lv:lvextend L 10G /dev/vg00/lvswap重新生成swap交换区:mkswap /dev/vg00/lvswap激活新生成的交换区:swapon v /dev/vg00/lvswap
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Karen110 Karen110
2年前
​一篇文章总结一下Python库中关于时间的常见操作
前言本次来总结一下关于Python时间的相关操作,有一个有趣的问题。如果你的业务用不到时间相关的操作,你的业务基本上会一直用不到。但是如果你的业务一旦用到了时间操作,你就会发现,淦,到处都是时间操作。。。所以思来想去,还是总结一下吧,本次会采用类型注解方式。time包importtime时间戳从1970年1月1日00:00:00标准时区诞生到现在
Wesley13 Wesley13
2年前
java验证课上代码
1.intvalue100;MyClassobjnewMyClass();这两种方式定义的变量是不一样的,第一种赋值方法直接就给了变量值,同时赋予了他空间,第二种方法没有赋值,只赋予了他空间。对象变量如果不引用一个真实的对象,则必须声明为null对于原始数据类型的变量(比如int),可以直接使用“”判断两变量值
Easter79 Easter79
2年前
SpringBoot使用@Value给静态变量注入值,不能正确读取相应的值
今天在调试代码的时候发现SpringBoot中使用@Value()给变量赋值,给普通变量赋值是可以的,但是给静态变量即static变量赋值的时候,读取不到相应的值,如果是字符串会读取为null,数字值会读取为0.网上查了一下才发现不能直接给static变量赋值。1、SpringBoot中使用@Value()给普通变量注入值:在applica
Stella981 Stella981
2年前
Groovy中方法的调用实现方式浅析(CallSite)
 在Groovy中可以很方便的交换两个变量的值,如:def (a, b)  1, 2;(a, b)  b, a; 这样,a,b变量的值就交换了,那么Groovy是怎样实现的呢? 来看看生成的字节码文件,关键的代码如下:  // Method descriptor 39 ()
Stella981 Stella981
2年前
SpringBoot使用@Value给静态变量注入值,不能正确读取相应的值
今天在调试代码的时候发现SpringBoot中使用@Value()给变量赋值,给普通变量赋值是可以的,但是给静态变量即static变量赋值的时候,读取不到相应的值,如果是字符串会读取为null,数字值会读取为0.网上查了一下才发现不能直接给static变量赋值。1、SpringBoot中使用@Value()给普通变量注入值:在applica
Wesley13 Wesley13
2年前
35岁是技术人的天花板吗?
35岁是技术人的天花板吗?我非常不认同“35岁现象”,人类没有那么脆弱,人类的智力不会说是35岁之后就停止发展,更不是说35岁之后就没有机会了。马云35岁还在教书,任正非35岁还在工厂上班。为什么技术人员到35岁就应该退役了呢?所以35岁根本就不是一个问题,我今年已经37岁了,我发现我才刚刚找到自己的节奏,刚刚上路。
可莉 可莉
2年前
20个常用的JavaScript简写技巧
任何编程语言的简写技巧都能够帮助你编写更简练的代码,让你用更少的代码实现你的目标。让我们一个个来看看JavaScript的简写技巧吧。1\.声明变量//Longhandlet x;let y20;//Shorthandlet x,y20;2\.给多个变量赋值我们可以使用数组解构来在一行中给