劍指offer讀書筆記:第二章,面試基本知識02

問題1 有序矩陣+右上角查找

這裏寫圖片描述

方法有二

  • 暴力查找
  • 右上角查找

問題變形:尋找第k小的數據

方法有二
- 暴力遍歷然後排序
- 右上角查找+二分查找

參考這個鏈接leetcode 668. Kth Smallest Number in Multiplication Table 有序矩陣搜索 + 右上角二分搜索

問題02 字符串地址

這裏寫圖片描述

str1和str2會自動分配空間,所以地址是不同的
但是str3和str4其實是相同的

—->寫時複製
—->Java的StringBuilder StringBuffer String
在這方面運行速度快慢爲:StringBuilder > StringBuffer > String

  • String爲字符串常量,而StringBuilder和StringBuffer均爲字符串變量;
  • 在線程安全上,StringBuilder是線程不安全的,而StringBuffer是線程安全的

問題03 替換空格

這裏寫圖片描述

方法有二

  • 直接暴力移動替換,複雜度O(n*n)
  • O(n),先掃描空格數量計算替換後的字符串數量,然後遍歷替換,省去了字符串的移動。注意要從後向前遍歷

    如下圖:
    這裏寫圖片描述

—-》合併k個有序的數組
依次合併會超時,很費時間;
應該折半兩兩合併,知道得到最後結果

問題04 從尾到頭打印鏈表

這裏寫圖片描述

方法有二

  • DFS深度優先遍歷
  • 使用棧

問題05 構建二叉樹

這裏寫圖片描述

直接參考這個博客leetcode 297. Serialize and Deserialize Binary Tree 二叉樹的序列化和反序列化 + 深度優先遍歷DFS

問題06 兩個棧實現一個隊列

這裏寫圖片描述
進隊時,壓入stk1。
出隊時,stk2彈出。
stk2爲空時,stk1倒入stk2。兩次逆序恢復了原序。
參考這個博客leetcode 232. Implement Queue using Stacks 雙棧實現隊列

1)取棧頂元素: 返回有元素的隊列的首元素
2)判棧空:若隊列a和b均爲空則棧空
3)入棧:a隊列當前有元素,b爲空(倒過來也一樣)則將需要入棧的元素先放b中,然後將a中的元素依次出列併入列倒b中。(保證有一個隊列是空的)
4)出棧:將有元素的隊列出列即可。
參考這個博客leetcode 225. Implement Stack using Queues 雙隊列實現棧

發佈了716 篇原創文章 · 獲贊 30 · 訪問量 25萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章