1. 程式人生 > >劍指offer1-4題

劍指offer1-4題

第一題 二維陣列查詢

在一個二維陣列中(每個一維陣列的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函式,輸入這樣的一個二維陣列和一個整數,判斷陣列中是否含有該整數。

解題思路:

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。