最近做求職筆試題,遇到比較有意思的題目,題目或多或少涉及到《劍指Offer》的思路和知識點,如果不是刷書兩遍,估計不會做出來,分享一下互相學習!
************************************************************
1、不使用額外空間交換2個數據, 請寫出任意3種方法,并闡明其優缺點。
樣例: int a = 2; int b = 3 ;
不再聲明任何變量,使得 a = 3, b =2;
解題思路:?部分參考自 http://www.cnblogs.com/cornucopia2015/p/4896791.html
不使用中間變量而交換兩個數值變量的值,通常有三種做法:
1、加減法
a = a + b; b = a - b; a = a - b;
該方法可以交換整型和浮點型數值的變量,缺點是在處理浮點型的時候有可能會出現精度的損失。
2、乘除法
a = a * b; b = a / b; a = a / b;
該方法可以處理整型和浮點型變量,但在處理浮點型變量時也存在精度損失問題,而且乘除法比加減法要多一條約束:b必不為0,否則會報錯。
3、異或法
a ^= b; // a=a^b
b ^= a; // b=b^(a^b)=b^a^b=b^b^a=0^a=a
a ^= b; // a=(a^b)^a=a^b^a=a^a^b=0^b=b
這里需要用到異或運算的一個性質:任何一個數字異或它自己都等于0。異或法可以完成對整型變量的交換,對于浮點型變量它無法完成交換。
4、棧法 (需要額外空間,不推薦)
push a; push b; pop a; pop b;
使用反向的出棧順序來完成交換,它雖然沒有顯式的使用臨時變量,但還是會用到額外的存貯空間,不太符合題意。
源代碼和底層代碼。源代碼:
https://github.com/wylloong/TinyPrograms/blob/master/Coding%20Interviews/ExchangeWithoutTemp.cpp
************************************************************
2、給定一個數組,數組中除了某個特定數字只出現1次,其余數字均出現2次。請編寫函數,找出該數字。要求,空間復雜度O(n),時間復雜度O(n)。
1. 主程序需要包含對給定的2個測試文件的文件讀取操作。
2. 請編寫計時器類,并且對每個文件樣例的輸入和運算時間進行測量。
解題思路: Google面試題,必須結合異或的性質,任何一個數字異或它自己都等于0,參考《劍指Offer》的面試題56:數組中數字出現的次數。
源代碼:
https://github.com/wylloong/TinyPrograms/blob/master/Coding%20Interviews/FindNumsAppearOnce.cpp