- 面試題61:撲克牌中的順子
方法:五張牌排序,把大小王先當作零,然後統計零的個數,挨個求相鄰兩個數的間隔,若果間隔有0,表明有重複牌,則不可能是順子,如果0的個數大於所有數間隔的和,則是順子
- 面試題62:圓圈中最後剩下的數字
方法一:約瑟夫環,環形鏈表模擬圓圈,用list,k = (start + m - 1) % n ,k爲每次要刪除的數
方法二:找到每次被刪除數字的規律直接計算,
- 面試題63:股票的最大利潤
方法:從前往後遍歷,記錄當索引之前的數的最小值,然後用當前數減去最小值,每次循環需要更新最小值和差值的最大值
- 面試題64:求1+2+....+n
方法一:利用條件與的短路特性,即and前面的條件如果不滿足,不會執行後面的表達式,利用這點實現遞歸的if返回判斷return n and (n+self.Sum_Solution(n-1))
方法二:利用構造函數、函數指針、虛函數、模板等來實現
- 面試題65:不用加減乘除做加法
方法:利用位運算,每次把兩個數相抑或,得到沒有計算進位的結果,然後兩個數相與並<<1,得到只計算進位的結果,然後把得到的兩個數作爲新的加數,重複以上運算,知道表示進位的數爲0
- 面試題66:構造乘積數組
方法1:直接暴力連乘,時間複雜度n*2
方法2:通過i來劃分左右兩個部分,左面的a(n) = a(n-1)*A(n),右邊的b(n-1) = b(n)*A(n),然後B(n)=a(n)*b(n)
- 面試題67:把字符串轉化爲整數
方法一:直接用int()函數,可以用try 和except來捕獲異常
方法二:按部就班的寫,注意開頭是‘+’或者‘-’號的情況
- 面試題68:樹中兩個節點的最低公共祖先
情況一:是二叉搜索樹,利用已經排序的條件,挨個判斷跟節點,如果比兩個節點都大,則最低公共祖先在左子樹
情況二:不是二叉樹,但有指向父節點的指針,可以把此問題轉化成求兩個鏈表相交的第一個節點的題
情況三:不是二叉樹,沒有指向父節點的指針,需要先分別將兩條路徑保存,然後求這兩條路徑的最後一個公共節點