今天在面试过程中碰到了这个题,交换两个变量值,不使用第三个变量的实现方法。

总结了三种方法

第一种:数学计算法

例:

$a = 10;  $b = 12;

第一步:$a = $b-$a; // $a = 2;

第二步:$b = $b-$a; // $b = 10;

第三步:$a = $b+$a; // $b = 12;

这个原理非常简单:

数学概念来说就是,如果a-b=c,那么就可以得出a-c=b或者b+c=a

上面三步的计算替换下就是

$a = $b - $a;

$b = $b - ($b - $a) = $b - $b + $a = $a;  // 此时$a替换成了$b

$a = ($b - $a) + $a = $b - $a + $a = $b; // 此时$b替换成了$a

缺点很明显:只能适用于数字类型,字符串计算不了

 

延伸:

既然加减能实现变量交换,那么乘除应该也是可以的,例:

$a = $a * $b;

$b = $a / $b;

$a = $a / $b;

最终测试也是没问题的,而且浮点型的变量一样不影响结果

第二种:位运算

例:

$a = 10;  $b = 12;

$a = $a ^ $b; // 0110 ^ 1100 结果是 1010($a)

$b = $a ^ $b; // 1010 ^ 1100 结果是 0110($b)

$a = $a ^ $b; // 1010 ^ 0110 结果是 1100($a)

原理:

"^"符号是位运算中的异或,含义:对比两个二进制的每一位,如果相同结果值为0,不同结果值为1

这个是不仅仅适用于数字类型,字符类型的一样可以适用,因为在最终运算时,所有的值都会通过ASXII码来转成二进制来比较

第三种:类似于栈运算:

交换两个变量值,不使用第三个变量的实现方法_面试

上面的代码是学习的时候看到的,但是这一种是C/C++(应该是吧,没学过C/C++也不确定上面代码是什么语言)的实现方法,不适用于php;

不过php也有C封装的类似于栈运算的函数array_unshift(),array_push()--入栈、array_shift(),array_pop-出栈

所以php版的代码如下:

$a = 10;  $b = 12;

$a = Array($a);

array_push($a, $b);

$b = array_shift($a);

$a = array_shift($a);

一样支持数字类型和字符类型

交换两个变量值,不使用第三个变量的实现方法_面试_02