如何不借助其他变量的情况下交换两个变量的值

如何不借助其他变量的情况下交换两个变量的值

第一次看到这个问题的时候是2016年刚学习PHP的时候,那时候看面试题看到的,大概背了一下后进来就忘了。今天学习数学的时候偶然在一个帖子看到了,有所新收获,记录一下。

新手拿到这个问题的时候,多半是手足无措的,这怎么办?

不同的语言有不同的语法糖,比如这样

//Go
a, b = b, a

//php
list($a, $b) = [$b, $a];

对于语法技巧熟练的同学可以做如上的回答。

而如果我们从数学或者信息的角度来看看这个问题呢?

a和b之间不通过第三变量实现交换,本质上其中一个变量就需要实现信息的叠加然后还原,假设信息叠加之后我们称它的值为x,x和a可以还原出b,x和b可以还原出a。比如下面这样

a = a + b;
b = a – b;
a = a – b;

类似的还有这样

a = a * b
b = a / b
a = a / b

类似的,能够实现信息叠加还原都可以。上面这两种方式有一些缺点,比如假设a和b都是一个uint8的数字,在进行加法运算和乘法运算时,可能会面临溢出的问题。下面这种方法就显得更精巧一些了。

a = a ^ b;
b = a ^ b;
a = a ^ b;

一点点额外的启发。有没有发现在信息叠加之后,原有的信息被隐藏起来了,如果原有的两份信息,一份作为密文,一份作为密钥,那么一个简单的加密算法是否就实现了呢?哈哈。

发表评论

邮箱地址不会被公开。 必填项已用*标注