劍指offer的題目

2021-08-28 02:25:08 字數 3498 閱讀 8478

題目描述

乙隻青蛙一次可以跳上1級台階,也可以跳上2級……它也可以跳上n級。求該青蛙跳上乙個n級的台階總共有多少種跳法。

分析

跳乙個n階台階的方法數:

**

class solution 

};

題目描述

我們可以用2*1的小矩形橫著或者豎著去覆蓋更大的矩形。請問用n個2*1的小矩形無重疊地覆蓋乙個2*n的大矩形,總共有多少種方法?

分析

先不考慮n多大,從最下邊開始覆蓋

在不考慮n多大的情況下,f(n) = f(n-1)+f(n-2),而f(n-1) = f(n-2)+f(n-3),以此類推,這是個斐波那契數列啊,f(1) = 1,f(2) = 2,迭代算下去就好

**

class solution 

};

注:這道題要注意number==0的情況

題目描述

輸入乙個整數,輸出該數二進位制表示中1的個數。其中負數用補碼表示。

分析

1. 樸素法:一位一位統計,慢

2. 4位查表法:把0~15分別有多少個1儲存下來,把int數分為8塊,每塊4位,每塊有多少1可以查表很快得到,然後把每一塊1的個數加起來。

3. 8位查表法:同法2

4. 16位查表法;同法2

// 4位查表法

class solution ;

return m[n&0xf] +

m[(n>>4)&0xf] +

m[(n>>8)&0xf] +

m[(n>>12)&0xf] +

m[(n>>16)&0xf] +

m[(n>>20)&0xf] +

m[(n>>24)&0xf] +

m[(n>>28)&0xf];

}};

題目描述

給定乙個double型別的浮點數base和int型別的整數exponent。求base的exponent次方。

分析

樸素法:一次一次乘,但是如果exponent過於大,效率低

快速冪:原理是二分的思想,如果要算a^2b,先算出a^b,兩個a^b乘一下就是a^2b,可以用遞迴寫,也可以用迭**,當b特別大的時候,迭代記憶體消耗比遞迴小多了。

迭**法的思想:例如a^b,假設b的二進位制形式是1001,則a^b=a^(1000)*a^(0001),括號括起來的是二進位制形式,假設最低位位第1位,如果第一位為1,則需要乘一次a,如果第二位為1,則需要乘一次a^2,如果第三位為1,則需要乘一次a^4,。。。,如果第n為為1,則需要乘一次a^n,按照這樣的思想寫**就可以了。

**

class solution 

if(exponent < 0)

return

1.0/ans;

return ans;

}};

注:這道題要考慮指數可能是負數的情況,這種情況也好處理,只要檢測到指數是負數,返回正數次冪的倒數就好了

`題目描述

輸入乙個整數陣列,實現乙個函式來調整該陣列中數字的順序,使得所有的奇數字於陣列的前半部分,所有的偶數字於陣列的後半部分,並保證奇數和奇數,偶數和偶數之間的相對位置不變。

分析

方法1:如果單純是使奇數字於偶數之前,使用雙指標,乙個從左開始找偶數,乙個從右開始找奇數,都找到了,交換即可,這道題重點就在於,要保證奇數和奇數、偶數和偶數之間的相對位置不變。所以這時候可以從左往右找偶數,找到乙個偶數並且其右邊是奇數,就將這個偶數和奇數交換,以此類推,但是如果中間有連續的好多個偶數,就會很麻煩

方法2:使用乙個輔助陣列,用空間換時間,複雜度o(n),遍歷兩次原陣列,第一次將奇數全部複製到輔助陣列中,第二次將所有偶數複製到輔助陣列中,最後將輔助陣列的數全部複製到原陣列中

**

class solution 

};

題目描述

輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點。

分析

用兩個指標,第乙個指標在前邊走,當第乙個指標走到正數第k個結點,要走向第k+1個結點時,第二個指標開始往前走,第乙個指標走到頭,第二個指標所指的結點就是倒數第k個結點。具體細節在紙上畫一畫就清晰了

**

/*

struct listnode

};*/

class

solution

while(pre)

if(count

< k)

return null;

return cur;

}};

注:這道題要注意,k比結點數多的情況要返回null

題目描述

輸入乙個鍊錶,反轉鍊錶後,輸出新鍊錶的表頭。

分析

建立新鍊錶,每次插入元素都往頭插,如果是不帶頭結點的鍊錶,比較難插,可以建立乙個帶頭結點的鍊錶,最後返回頭結點->next

**

/*

struct listnode

};*/

class solution

return head->next;

}};

題目描述

輸入兩個單調遞增的鍊錶,輸出兩個鍊錶合成後的鍊錶,當然我們需要合成後的鍊錶滿足單調不減規則。

分析

建立乙個新的鍊錶,以歸併排序的合併的方式向鍊錶中新增元素

/*

struct listnode

};*/

class solution

else

}while(cur1)

while(cur2)

return head->next;

}};

題目描述

輸入兩棵二叉樹a,b,判斷b是不是a的子結構。(ps:我們約定空樹不是任意乙個樹的子結構)

分析

從b的根節點開始dfs,如果當前節點和a的根節點一樣,判斷當前節點的左子樹和a的左子樹是否一樣、右子樹和a的右子樹是否一樣,但是要注意,要設定回溯,確保每乙個跟a的根節點相同的節點都有機會作為根節點

**

劍指offer題目

在乙個二維陣列中 每個一維陣列的長度相同 每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非減排序的陣列的乙個旋轉,輸出旋轉陣...

劍指OFFER 題目review

劍指offer ac 三道題,現在review下 題目一 從尾到頭列印鍊錶 輸入乙個鍊錶,按煉錶值從尾到頭的順序返回乙個arraylist。我的思路 1.鍊錶值從頭到尾順序放入vector中 2.逆序vector 實現 class solution int size data.size for in...

劍指offer題目彙總

1.數值的整數次方 題目描述 給定乙個double型別的浮點數base和int型別的整數exponent。求base的exponent次方。如下 class solution double powerpositive double base,int exponent 2.調整陣列順序使奇數字於偶數前...