劍指offer面試演算法題

2021-08-21 19:53:51 字數 1802 閱讀 9985

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就不可能是該壓棧序列的彈出...