今天在面试过程中碰到了这个题,交换两个变量值,不使用第三个变量的实现方法。
总结了三种方法
第一种:数学计算法
例:
$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);
一样支持数字类型和字符类型