一道有趣面试题 -【交换两个变量】

427 阅读3分钟

前言


这道题目是最近在面试过程中遇到的。看到这个标题,想必很多同学心里碎碎念:不就是交换变量,这也算有趣?不急,且看后面的文章娓娓道来。

常规方法


面试官:有a和b两个变量,实现两个变量交换的代码
内心os:这么简单的题,简直信手拈来啊(偷笑

一拿到这个题,肯定是洋洋洒洒写下如下代码:

var t;
t = a;
a = b;
b = t;

面试官:你这个使用了临时变量,有没有不使用临时变量方法
内心os:简单,这还能难得倒我。

先装作若有所思,再提笔挥洒如下:

[a,b] = [b,a]

使用了 ES6 解构赋值的特性来实现

面试官:你这个使用了ES6的,有没有使用标准ES5的方法来实现
内心万马奔腾面带微笑os:这不是为难我胖虎吗?
(猝)

上面两种实现方法都是我们写代码中常用的,那么到底有没有其他方法可以实现上述的交换两个变量呢?答案肯定是有的,继续往下看之前,自己可先思考下能写出几种方式来。

其他方法


1. 利用算术运算

主要思路是先将一个变量变成一个和 a、b 都有关系的值,然后进行相加或者相减,进行交换。

var a = 10,
    b = 20;
a = a + b; // a = 30 b = 20
b = a - b; // a = 30 b = 10
a = a - b; // a = 20 b = 10

这种方法挺容易理解的,主要是取其中一个变量存放 a、b 两个变量的和,当然,用差的形式也是可以的

var a = 10,
    b = 20;
a = a - b; // a = -10 b = 20
b = a + b; // a = -10 b = 10
a = b - a; // a = 20 b = 10

这是利用存差的方式来交换,理解起来可能没有存放求和的过程来的直观,但是两者基本原理都是一样的。但该方法存在一个问题,如果数值太大的话可能会造成溢出。这个要注意。

2. 利用数组特性

思路大同小异,还是取一个变量存放 a、b 两个关系,我们用数组来存放

var a = 10,
    b = 20;
a = [a, b]; // a = [10, 20] b = 20
b = a[0]; // a = [10, 20] b = 10
a = a[1]; // a = 20 b = 10

3. 利用对象特性

该方法和上面利用数组方法一样,只不过换成对象来存放

var a = 10,
    b = 20;
a = {a: b, b: a}; // a = {a: 20, b: 10} b = 20
b = a.b; // a = {a: 20, b: 10} b = 10
a = a.a; // a = 20 b = 10

4. 异或方法

这个方法很多同学应该都不了解,利用的是位运算的技巧。关于位运算的可以简单看下我的上篇文章了解下

JS中的【位操作符】浅识

通过异或的方式,来进行变量的替换。

var a = 10, // a二进制为 1010
    b = 11; // b二进制为 1011
a = a ^ b; // a = 0001 b = 1011
b = a ^ b; // a = 0001 b = 1010
a = a ^ b; // a = 1011 b = 1010

这个方法比较巧妙,先用变量 a 存放 a和b 异或的结果,再和 b 进行异或就能得出变量 a 的值。整体思路有点像算术运算的方法。大家可以消化下。

小结


虽然这是道很平常普通的题目,现实写代码中也不会要求实现这么多种。但主要目的还是通过这个小问题切入手,可以拓展出更多的知识点。有其他更加骚操作实现的同学可以在评论里展现下哦。

欢迎各位看官看完顺手点个赞。