1. 二維陣列中的查詢
題:在乙個二維陣列中(每個一維陣列的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。
思路:從右上或者左下(eg.左下,則大的話往右找,小的話往上找)
**:
private static boolean find(int target, int array)
else if (target < array[i][j])
else }}
return false;
}
注意:在外層迴圈判斷的時候一定要邊界檢測,加j < array[i].length,否則會超出執行時間。
2. 替換空格
題:將乙個字串中的每個空格替換成「%20」
思路:先記錄空格數,然後計算出新字串的長度,從後往前遍歷,增加到新字串中
優點:不用每次遍歷字串,然後後面的所有位後移
**:
public string replacespace(stringbuffer str)
}int newlength = str.length() + 2 * count;
char array = new char[newlength];
int index = newlength - 1;
for (int i = length - 1; i >= 0; i--)
else
}return new string(array);
}
注意:最後不能用用array.tostring(),這樣的話顯示的是位址,只能用new string(array);
3. 從尾到頭列印鍊錶
思路:遞迴
**:
public arraylistprintlistfromtailtohead(listnode listnode)
list.add(pnode.val);
}return list;
}
注意:一定要先判斷pnode != null,預防給出listnode為空的情況,否則pnode.next就會報空指標異常
4.※ 重建二叉樹
題:輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。
思路:遞迴。找到序列中開始和結束的點。
注意:重點是左子樹結束的點和右子樹開始的點!!!
public treenode reconstructbinarytree(int pre,int in)
private treenode rebuildtree(int pre, int startpre, int endpre, int in, int startin, int endin)
treenode root = new treenode(pre[startpre]);
for (int i = startin ; i <= endin; i++)
}return root;
}
5. 用兩個棧實現乙個佇列
思路:入隊就直接stack.push(),但是出隊的時候,需要判斷必須是乙個棧為空,另乙個不空,就把不空的棧的元素全部壓入另乙個棧(其實就是兩次push)
注意:每次一定要判斷棧是不是空!!!!且兩個棧不能同時為空
**:
public void push(int node)
public int pop()
}return stack2.pop();
}
6.※旋轉最小數字題:把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。
note:給出的所有元素都大於0,若陣列大小為0,請返回0。
思路:因為非遞減,找到前乙個數比後乙個數大的位置i,則這個i+1就是最小數所在的位置。
但是查詢,如果兩兩元素比較時間複雜度較大,用二分。
注意:按刷題模板來!!但是要注意,退出迴圈的時候,要檢查mid是否被更新(以此判斷最後return的是array[mid]還是array[left])。
例如這道題就不能返回array[mid],因為退出迴圈的時候mid還沒有被更新(還是上次的),所以只能返回array[left]。
**:
public int minnumberinrotatearray(int array)
if (array.length == 1)
int left = 0, right = array.length - 1;
int mid = -1;
if (array[left] < array[right])
while (left < right) else
}return array[left];
}
7. 斐波那契
**:
public static int solutionfibonacci(int n)else if(n == 1)else
return result[n];
}
int fibonacci(int n)
return f;
}
其中,f其實是本項的值(從0開始),g是後一項的值。
初始化的時候,f永遠是第乙個能取到的數的值,g是第二項;迴圈條件也是到能取到的第二項(本題是f(1))
如本題中,f是f(0)=0,g是f(1)=1;
返回的永遠是f。
8. 跳台階
思路:1.斐波那契遞迴;2. 類似動規,記錄下前面的結果(假設在第三階,可以從第一階兩步到,此時到第二階有幾種跳法現在也有幾種;也可以用第二階一步到,此時到第一階有幾種跳法現在也有幾種)
int first = 1, second = 2, third = 0;
for (int i = 3; i <= number; i++)
return third;
public int jumpfloor(int target)
return f;
}
9.**跳台階思路: 1. 遞迴:
f(n-1) = f(0) + f(1)+f(2)+f(3) + ... + f((n-1)-1) = f(0) + f(1) + f(2) + f(3) + ... + f(n-2)
f(n) = f(0) + f(1) + f(2) + f(3) + ... + f(n-2) + f(n-1) = f(n-1) + f(n-1)
可以得出:
f(0) = f(1) = 1
f(n) = 2*f(n-1)
2.
return 1<
1左移number-1位,即2的(number-1)次方。每個台階都有跳與不跳兩種情況(除了最後乙個台階),最後乙個台階必須跳。所以共用2^(n-1)中情況。
其實就是把這個遞迴化簡了,假設n=3, 那麼f3=2*2*f(1); 假設n=4,那麼f(n)=2*2*2*f(1); 所以結果其實就是:2^(n-1)
10. 矩形覆蓋
題:我們可以用2*1的小矩形橫著或者豎著去覆蓋更大的矩形。請問用n個2*1的小矩形無重疊地覆蓋乙個2*n的大矩形,總共有多少種方法?
思路:還是類似斐波那契。target > 2 分為兩步考慮:
第一次擺放一塊 2*1 的小矩陣,則擺放方法總共為f(target - 1)
第一次擺放一塊1*2的小矩陣,則擺放方法總共為f(target-2)
因為,擺放了一塊1*2的小矩陣(用√√表示),對應下方的1*2(用××表示)擺放方法就確定了,所以為f(target-2)
非遞迴:
if (target <= 0) return 0;
int f = 1,g = 2;
while (target > 1)
return f;
動態規劃:
public int rectcover(int target)
int pre1 = 1, pre2 = 2;
for (int i = 3; i <= target; i++)
return pre1;
}
牛客劍指offer 1 10題解
在乙個二維陣列中 每個一維陣列的長度相同 每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。class solution else continue 記憶體集體向右移兩個位元組 並置 0前兩個位元組 v...
劍指offer 醜數(好題,思路)
題目描述 把只包含因子2 3和5的數稱作醜數 ugly number 例如6 8都是醜數,但14不是,因為它包含因子7。習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。思路 似乎只能乙個個判過去。判斷是否為醜數的時候,求因子時迴圈停止的條件是到平方根為止。這麼做會超時 而且題目中應該...
牛客網劍指Offer題解C 1 10
在乙個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。首先在二維陣列的第一行的數與這個整數比較,找到比這個整數大的位置的前乙個位置,如果都比這個整數小,則這個位置就是第一行的最後乙個位置。...