不用額外空間完成兩個整數的交換

面試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

相關文章
相關標籤/搜索