《劍指offer》源碼筆記

《劍指offer》源碼筆記

本篇針對源碼問題感想。

沒寫代碼的面試題

  • 面試題 1 c++語言賦值(需要返回引用等等)
  • 面試題 2 singleton模式,不熟
  • 面試題 6 中序前序樹查找,繁瑣
  • 面試題 8 旋轉數組,單純省時間
  • 面試題 20 順時針打印矩陣 邊界問題
  • 面試題 22 棧的壓入、彈出序列
  • 面試題 26 複雜鏈表的複製,代碼很簡單,思路重要
  • 面試題 32 從1到n整數1出現的次數 主要是數學上的規律,代碼不重要
  • 面試題 33 數組排成最小的數 數學定義規則,並不是很懂。感覺上像是動態規劃
  • 面試題 36 數組中逆序對。 比較麻煩,遞歸調用,段內逆序,排序,段間
  • 面試題 37 兩個鏈表第一個公共結點 比較簡單

某些題的感想

面試題7 兩個stack維護queue

  • 源碼中沒有看到維護stack1中原queue的操作:
while (!stack2.empty())
{
    T& element = stack2.top();
    stack2.pop();
    stack1.push(element);
}
  • 源碼中返回的是刪除之後的隊列頭,應該是刪除之後剩下的
T head = stack2.top();
stack2.pop();

感覺這兩步操作順序應該是反過來的。

面試題13 刪除鏈表結點

vs2013版本運行報錯,360默認爲木馬,可能是對指針的某些操作使得360智障了。
添加信任白名單。
添加iostream,pause

面試題15 第k個結點

遞歸可做

面試題30 最小的k個數

快排思想利用Partition想法的複雜度爲O(n)原因如下:
Partition的複雜度爲O(n),然後需要做有限次即可,所以總體還是O(n)。
但是當運氣比較差的時候也是快排運氣最差的時候。

面試題34 醜數

可以維護三個隊列M2,M3,M5來存儲每個醜數乘以2,3,5的值,然後不斷找每個隊列中的最小值。找到醜數數列。

面試題43 n個骰子的點數

可以用動態規劃:f(k,n)=f(k-1,n-1)+f(k-1,n-2)+f(k-1,n-3)+f(k-1,n-4)+f(k-1,n-5)+f(k-1,n-6)
f(1,1)=f(1,2)=f(1,3)=f(1,4)=f(1,5)=f(1,6)=1
http://blog.csdn.net/yusiguyuan/article/details/41048299

特殊思路

面試題10 二進制中1的個數

位運算:整數-1,再和原整數做與運算會把最右邊一個1變成0。

面試題11 數值的整次乘方

  • 等於 equal是要近似的文中給的±0.0000001
  • 位運算代替乘除2

面試題14 調整數組順序使奇數位於偶數之前

函數打包:

void ReorderOddEven_2(int *pData, unsigned int length)
{
    Reorder(pData, length, isEven);
}

void Reorder(int *pData, unsigned int length, bool (*func)(int))
{
...
}
bool isEven(int n)
{
    return (n & 1) == 0;
}

面試題40 數組中只出現一次的數字

數組一直做異或,兩個相同的數字就變成0了

面試題41 和爲s的兩個數vs整數序列

整數序列和兩個數類似,兩個數爲兩側收縮,序列爲兩個標誌範圍內序列,爲一側伸縮

面試題42 翻轉&左旋轉字符串

左旋轉是兩步:分段翻轉,整體翻轉

“`

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章