劍指offer1-4題
阿新 • • 發佈:2018-11-05
第一題 二維陣列查詢
在一個二維陣列中(每個一維陣列的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函式,輸入這樣的一個二維陣列和一個整數,判斷陣列中是否含有該整數。
解題思路:
1.利用二維陣列行列的特點,從右上角或者左下角開始尋找,每次尋找都可以減少一行或一列。(最優方案)
如下圖所示:
2.二分查詢,以行為單位,每次對一行進行遍歷,二分查詢的比較則是行首元素。(原始思路)
第二題 替換空格
請實現一個函式,將一個字串中的每個空格替換成“%20”。例如,當字串為We Are Happy.則經過替換之後的字串為We%20Are%20Happy。
無難點,主要為字串子串的拼接問題
第三題 從尾到頭列印連結串列
輸入一個連結串列,按連結串列值從尾到頭的順序返回一個ArrayList。
解題思路:
1.看到倒序,應該想到棧,不顯式宣告棧,可以利用遞迴。(最優思路)
public class Solution { ArrayList<Integer> arrayList=new ArrayList<Integer>(); public ArrayList<Integer> printListFromTailToHead(ListNode listNode) { if(listNode!=null){ this.printListFromTailToHead(listNode.next); arrayList.add(listNode.val); } return arrayList; } }
2.先將元素放入列表當中,然後倒序,倒序可以採用互換的方式,這樣可以節省空間。(原始思路)
int tmp = list.get(i);
list.set(i, list.get(list.size() - i - 1));
list.set(list.size() - i - 1, tmp);
第四題 重建二叉樹
輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6},則重建二叉樹並返回。
相關知識介紹:
前序遍歷是根左右,中序遍歷是左根右。
解題思路:
1.前序遍歷的首位肯定是根節點,然後在中序遍歷中找尋這個根節點,那麼前半部分是左子樹,右半部分是右子樹,
採用遞迴,則可構建完整二叉樹。(一般思路)
注意事項:
1.遞迴出口要設計
2.可以使用Arrays.copyOfRange擷取子陣列,但是注意是從陣列下標from到to-1。