不用额外空间完成两个整数的交换

面试4分实力,6分运气,本周运气还不错,遇到的面试题都是看过的,希望这次的一面能过吧。

本周遇到的其中一个面试题就是这个:在不使用额外空间的情况下,完成两个整数的值交换,问题不难,但是若没看见过,相信能在面试的紧张环境下想出来的肯定不算多。

加减法

先假设a = 1 , b = 2,要交换 a 和 b。

  1. 执行a = a + b,现在 a 就是 a + b。
  2. 执行b = a - b,b 就相当于 a + b - b 等于原来的 a,b 就变成 a 了。
  3. 执行a = a - b,现在 b 就是原来的 a,a 就相当于 a + b - a 就等于原来的 b,a 变成 b 了。

异或法

现在我的感受就是,若是一个跟计算有关的问题想不到解决办法的时候,那它多半就是和位运算有关了。

而这题就可以通过异或完成(幸好看见过,不然面试还真想不起来)

  1. 任何数和 0 异或,都得任何数。
  2. 任何数与自身异或,都得 0。

先假设a = 1 , b = 2,要交换 a 和 b。

  1. 执行a = a ^ b ,现在 a 就是 a ^ b。
  2. 执行b = a ^ b,b 就相当于 a ^ b ^ b 等于原来的 a,b 就变成 a 了。
  3. 执行a = a ^ b,现在 b 就是原来的 a,a 就相当于 a ^ b ^ a 就等于原来的 b,a 变成 b 了。

总结

面试之前本来对这次面试不报希望,因为面的前一天才打电话通知,而基础知识又已经模糊了,还好简单的过了一遍,面的时候问的也不算很难,但仍然有不足,首先仍然是算法,一道不难的题但仍没有做到一次bug free,还是在面试官的提醒下才发现问题所在,再就是像面试官说的思路不够灵活,有时候反过来想一下就能发现一个更好的解决办法,再就是回答问题的时候把一个知识点说错了(只发现自己说错了一个,可能并不只是一个……),最后面试官说的是等待后续安排,也不知是过还是没过,希望能过吧。

下周的重点应该就是消息队列和算法了,加油。

你可能感兴趣的:(java,位运算)