关于java:不用额外空间完成两个整数的交换

43次阅读

共计 750 个字符,预计需要花费 2 分钟才能阅读完成。

面试 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,还是在面试官的揭示下才发现问题所在,再就是像面试官说的思路不够灵便,有时候反过来想一下就能发现一个更好的解决办法,再就是答复问题的时候把一个知识点说错了(只发现自己说错了一个,可能并不只是一个……),最初面试官说的是期待后续安顿,也不知是过还是没过,心愿能过吧。

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

正文完
 0