面试算法题(5)--交换两个整型变量(不借助临时变量)

交换两个整型变量(不借助临时变量)


这是多年前我做Java时面试碰到的题目,其实不难。
特意写下这篇博客,是因为我发现有不止一种方法可以实现,原谅我无聊的双手。



先简单说说普通的方法吧,如上图:
int i = 5;
int p = 3;
int temp;


先进行第一步,把p的值保存到临时变量tmep中,即temp = p;
此时p的空间腾出来了(可以擦除内容了),第二步,把i的值赋给p,即p = i;
此时i的空间腾出来了,第三步,把temp的值放回到i中,即i = temp;


写成代码及如下:
temp = p;
p = i;
i = temp;


即常见的变量值交换的代码,小学生都会的。


那么,如果没有中间变量,怎么交换呢?
还是上例,如果直接把i = p;此时i和p的值都是3了,i之前的值5丢失了。


我们换个思路来思考问题:
变量的原始状态值:
i = 5;
p = 3;
我们最终想要的状态值:
i = 3;
p = 5;


如果把i+p的值即为x;即 x = 8;
然后i = x - i; p = x - p;
即最终结果:
i = 3;
p = 5;


此时出现了中间变量x。如何让x消失呢?
我把x的值保存在i或p上,随意,如果:
i = i + p;
此时,i的值是8,算是脏了。p的值还是3,是干净的。


我先来计算p交换后的值:
p = 8 - 3 = 5,即p = i - p;
此时,i的值还是8,p的值是交换后的值了,是5


那么再得到i交换后的值:
i = 8 - 5 = 3,即i = i - p;
此时,i的值更新为3了。


即得到最终结果
i = 3;
p = 5;
程序代码为:
i += p;
p = i - p;
i = i - p;


这是一种常见的实现方法,很巧妙的解决了问题。


同理,如果我用 * / 运算能否解决问题呢?当然可以。
i *= p;     //i = 15, p = 5
p = i / p;  //i = 15, p = 3
i = i / p;  //i = 5, p = 5


这也是一种实现思路。


那么除了上面的两种方法外,个人感觉使用其他运算,比喻位运算符应该也可以实现,可以自己去尝试下。


猜你喜欢

转载自blog.csdn.net/fesdgasdgasdg/article/details/81055567