《劍指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 翻轉&左旋轉字符串
左旋轉是兩步:分段翻轉,整體翻轉
“`