1.長度為n的陣列裡面的元素都在0-n-1之間,找出第乙個重複的數字
思路:從頭到尾依次遍歷,如果當前的值a[i] != i,如果a[i] != a[ a[i] ]那麼需要把a[ a[i] ]位置上的值與a[i]作交換(把對的值放在對的位置),之後繼續判斷此時的a[i](位置沒有移動),如果a[i] == a[ a[i] ],證明對的位置上有對的元素,此元素就是第乙個重複的元素,返回就好。
核心**:
for(int i=0; i2.二維陣列查詢
陣列從左到右從上到下,元素依次增大。查詢乙個一直的數num是否存在於這個erwin陣列中。
思路:從右上角開始查,遵循num大向下,num小向左的方法,找到左下角都沒有找到,證明失敗
if (matrix == null || matrix.length == 0 || matrix[0].length == 0)
return false;
int rows = matrix.length, cols = matrix[0].length;
int r = 0, c = cols - 1; // 從右上角開始
while (r <= rows - 1 && c >= 0)
return false;
3.替換空格
把字串中間的空格用%20代替
思路:兩個指標分別指向原字串的末尾和新字串的末尾,空間充足的情況下,倒著輸出,當源字串碰到空格之後,新字元竄的指標向前挪,並插入02%。依次處理,直到處理完原來的字串
int index1 = str.length();
空格數n;
int index2 = str.length() + 2*n; //每各空格需要額外插入兩個空間
while(index1 >= 0)
else
}
4. 青蛙跳台階
每次跳1或者2階
思路:動態規劃問題,最關鍵的是要列出狀態方程。用f(n)代表有幾個台階時候跳的方法數,很顯然f(0) = 0, f(1) = 1.
有f(n) = f(n-1) + f(n-2),即首先跳乙個台階和首先跳兩個台階的跳法。
f(0) = 1;
f(1) = 2; //雖然有乙個台階,但是可以按跳兩個台階那樣跳,所以是2
for(i=2; i優化方法可以參考斐波那契數列優化方法,兩個變數,依次變換(後者等於前兩者相加
5. **青蛙跳
每次可以跳1、2、3...n階台階。求跳乙個n階的台階有多少中天跳法。
分析:f(n)=f(n-1)+f(n-2)+f(n-3)+……f(1)+f(0);
f(n-1)=f(n-2)+f(n-3)+……f(1)+f(0);
即f(n)=2*f(n-1);
於是只要保留1項結果就可以了,再分析初始值,
f(0)=1;
f(1)=1;
f(2)=2;……
於是f(n)=2^(n-1);
7.矩形覆蓋
用2*1的小長方形橫著或者豎著放,填滿乙個2*n的長方形,有多少種方法
思路:動態規劃的思想,dp[0] = 1,dp[1] = 2(橫著放、豎著放);
因此有動態規劃方程:dp[n] = dp[n-1] + dp[n-2]; return dp[n-1]。2*n建立在第n-1個橫放或者豎放的基礎上,橫放,n-2;豎放n-1。
優化方法可以參考斐波那契數列優化方法,兩個變數,依次變換(後者等於前兩者相加)
8.旋轉陣列中的最小數字
用類似二分查詢的方法
劍指offer 面試35題
面試35題 題目 複雜鍊錶的複製 題 輸入乙個複雜鍊錶 每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點 返回結果為複製後複雜鍊錶的head。注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空 解題思路一 python作弊法 解題 coding ...
劍指offer 面試33題
面試33題 題 二叉搜尋樹的後序遍歷序列 題目 輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則輸出yes,否則輸出no。假設輸入的陣列的任意兩個數字都互不相同。解題思路 遞迴 解題 coding utf 8 class solution defverifysquenceof...
劍指offer 面試31題
面試31題 題目 棧的壓入 彈出元素 題 輸入兩個整數序列,第乙個序列表示棧的壓入順序,請判斷第二個序列是否為該棧的彈出順序。假設壓入棧的所有數字均不相等。例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對應的乙個彈出序列,但4,3,5,1,2就不可能是該壓棧序列的彈出...