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

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

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

加减法

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

  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

  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,仍是在面试官的提醒下才发现问题所在,再就是像面试官说的思路不够灵活,有时候反过来想一下就能发现一个更好的解决办法,再就是回答问题的时候把一个知识点说错了(只发现本身说错了一个,可能并不仅是一个……),最后面试官说的是等待后续安排,也不知是过仍是没过,但愿能过吧。总结

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

相关文章
相关标签/搜索