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

胡哥有话说 等级 878 0 0

引言

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

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

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

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

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

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

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

后记

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

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

收藏
评论区

相关推荐

面试官在“逗”你系列:数组去重你会几种呀?
前言 数组去重是一个老生常谈的话题,也是前端童鞋在面试时的一道高频题。本文将深入的探索数组去重的原理及实现,为各位小伙伴提供多种可以反手“调戏”面试官的解决方案。 话不多说,上去就来一梭子... 数组去重核心原理 价值100W的核心原理上来就给你了...,记得留言点赞鸭! 1. 一般我们都会创建临时变量tmp,存储不重复的元素(以数组元素存储或对
面试官在“逗”你系列:连续子数组的最大和或最小和
前言 本文题目是“连续子数组的最大和或最小和”。 话不多说,开始“打怪”修炼... 一、理解题目 以“连续子数组的最大和”为例,相当于我们在数组中,计算连续的子数组的和,找寻最大值。如在数组3, 2, 1, 2, 4, 6, 5中连续子数组的最大和为:3 (2) 1 2 4 8 输入:3, 2, 1, 2, 4, 6,
面试官在“逗”你系列:不借助第三变量交换两个变量值的方案你有几种?
引言 在我们学习编程之初,就学习过变量的赋值操作,同时也学习了将一个变量的值赋值给另外一个变量。对于交换两个变量的值,很多童鞋都有解决方案。然鹅,对于面试官提出的不借助第三变量来交换两个变量的值,你能想到几种解决方案呢? 如果你只知道一种方案,请你认真看下去... 如果你知道两种方案,那么你可以来了解更多方案了... 一、最简单的实现最初的记忆 让
图文并茂讲清楚 JavaScript 内存管理
作为一个 JavaScript 的开发者,大多数情况下你可能不会担心内存管理问题,因为 JavaScript 引擎会帮你处理这些。但是在开发过程中,你或多或少的会遇到一些相关的问题,比如内存泄漏等,只有了解了内存分配的工作机制,你才会知道如何去解决这些问题。 在这篇文章中,我将会向你介绍 内存分配 和 垃圾收集 的机制,以及如何避免一些 常见的内存泄漏 的
你不知道的JSON Schema
1、JSON?JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。具有简洁、可读性高、支持广泛的特点。下面我们用JSON描述了一个商品的基本信息,包含了JSON的一些基本数据的类型 。json{ "productId": 1, "
你不可不知的JS面试题
1、JS中有哪些内置类型?7种。分别是boolean、number、string、object、undefined、null、symbol。 2、NaN是独立的一种类型吗?不是。NaN是number类型。 3、如何判断是哪个类型?Object.prototype.toString.call(),返回为\[object Type\]。 现在我们来验证一下
用python关对象电脑,“分手秘籍”,慎用!!!
​好多天没有跟对象吵架了,有点想练练嘴皮子功夫了,想点办法惹对象生气来。(醒醒,你没对象!) 好了,不逗了,这边教大家用python悄咪咪的控制电脑,微信来操作电脑关机(嘻嘻嘻) 学会了就可以在对象打游戏的时候,把电脑关了(谁叫他不理你,我说的不是“他”呀) 注意:感情不稳定者慎用!!! 一不小心就会..........分手吧粗体 下面是实际操作: 远程控制
10000,感谢有你
![](https://oscimg.oschina.net/oscnet/461c7da4-bf4e-44d9-b6fb-fc2ba4acd433.gif) 点击上方蓝色字体,关注我 —— 一个在**阿里云**打工的**清华****学渣**! ![](https://oscimg.oschina.net/oscnet/9a500604-6
MySQL 不怕你不会,就怕你不学
**Windows服务** 1 -- 启动MySQL 2 net start mysql 3 -- 创建Windows服务 4 sc create mysql binPath= mysqld\_bin\_path(注意:等号与值之间有空格) **连接与断开服务器** 1 mysql -h 地址 -P 端口 -u 用户名 -p 密码 2 SHOW PRO
ES2020 中 Javascript 10 个你应该知道的新功能
好消息 - ES2020 新功能已经落地!这就意味着,现在对 ES2020 中 Javascript 的新增和改进要有一个完整的了解。让我们来看看都有哪些改变。 **1、BigInt** ------------ BigInt,Javascript 中最期待的新功能终于落地。它允许开发者在 JS 中使用更大的整数进行数据处理。 之前,Javas
JavaScript 执行效率不行?因为你还没用 V8
作为**当下使用最广泛的 JavaScript 引擎**,V8 的生态圈非常庞大,这与它革命性的设计密不可分。 V8 出现之前,所有 JavaScript 引擎用的都是解释执行的方式,这是 JS 执行速度过慢的主要原因;而 V8 引入的即时编译(JIT)双轮驱动设计,混合编译执行和解释执行两种手段,**为 JavaScript 的执行速度带来了极大
Redis 的监控指标有哪些?别说你不知道!
### 监控指标 •性能指标:Performance •内存指标: Memory •基本活动指标:Basic activity •持久性指标: Persistence •错误指标:Error ### 性能指标:Performance ![](https://oscimg.oschina.net/oscnet/up-d536aa6949457e7
Redis源码入门
sds,全称Simple Dynamic Strings,是Redis自定义的一个字符串类型。 typedef char *sds; 看到这你肯定内心觉得Redis在逗你,这不就是一个字符数组么,怎么就Simple Dynamic Strings了呢 !没错,我当时也是这么觉得的,但是仔细阅读源码后发现sds并不是一个人在战斗,它还有战
JavaScript中if判断包含逗号表达式
有时会看到JavaScript中if判断里包含英文逗号 ",",这个是其实是逗号表达式。在if条件里,只有最后一个表达式起判断作用。请看如下示例:jslet a 1, b 2, c 3;// if只判断最后一个表达式if (a 10, b 20, c 3) console.log("c 3"); else console.log("c !
Script标签位置
不会吧,不会吧,前端人 2021年了还有人把script标签放在标签中不合适了吧。是,你是可以把script放在中,但是你知道这意味着什么吗?兄嘚,意味着javascript代码都下载下来,解析和解释完成后在渲染你的页面,页面渲染延迟,浏览器窗口再次期间是空白的,大家都很忙的,兄嘚没人等你加载完啊。放在里面啊这样javascript处理之前,页面已经渲染完成了,显示空白页面的时间也就少了呀。