2020 12 10 劍指offer打卡

2021-10-11 18:59:45 字數 4205 閱讀 2072

題目描述

陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為9的陣列。由於數字2在陣列**現了5次,超過陣列長度的一半,因此輸出2。如果不存在則輸出0。

解題思路

1.雜湊表:統計每個數出現的次數;時間複雜度o(n),空間複雜度o(n);

2.排序法:先將陣列排序,可能的眾數肯定在陣列中間,然後判斷一下,排序時的時間複雜度為o(nlogn),空間複雜度為o(1);

3.相互抵消演算法:首先定義出現的次數cnt為1,初始值為val,如果後面乙個數字和相面不同則相減,同時更新val;相同則相加,如果存在大於一半的眾數那麼一定是最後的val,但最後要加個迴圈判斷是否真的滿足條件。時間複雜度為o(n),空間複雜度o(1);

4.暴力解法:遍歷陣列,統計每個數出現的次數,時間複雜度o(n^2)

**實現

class

solution

return 0;*/

//思路4:暴力解法

int half=numbers.

size()

/2;for

(int i=

0;isize()

;i++)}

if(cnt>half)

}return0;}};

題目描述

求出1~13的整數中1出現的次數,並算出100~1300的整數中1出現的次數?為此他特別數了一下1~13中包含1的數字有1、10、11、12、13因此共出現6次,但是對於後面問題他就沒轍了。acmer希望你們幫幫他,並把問題更加普遍化,可以很快的求出任意非負整數區間中1出現的次數(從1 到 n 中1出現的次數)。

解題思路:**:題解

根據當前位cur值的不同,分為以下三種情亂:

1、當 cur=0 時: 此位 11 的出現次數只由高位 high 決定,計算公式為:high*digit;

2、當 cur = 1cur=1 時: 此位 11 的出現次數由高位 highhigh 和低位 lowlow 決定,計算公式為:

3、當 cur = 2, 3, …, 9 時: 此位 11 的出現次數只由高位 high 決定,計算公式為:

}}題目描述

輸入乙個正整數陣列,把陣列裡所有數字拼接起來排成乙個數,列印能拼接出的所有數字中最小的乙個。例如輸入陣列,則列印出這三個數字能排成的最小數字為321323。

class

solution

string printminnumber

(vector<

int> numbers)

return res;}}

;

題目描述

把只包含質因子2、3和5的數稱作醜數(ugly number)。例如6、8都是醜數,但14不是,因為它包含質因子7。

習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數

常規判斷是否是醜數:

bool

isugly

(int num)

while

(num%3==

0)while

(num%5==

0)return num==1?

true

:false

;}

解題思路:

假設當前存在 3 個陣列 nums2, nums3, nums5 分別代表醜數序列從 1 開始分別乘以 2, 3, 5 的序列, 即分別乘以2,3,5:

nums2 =

nums3 =

nums5 =

最終的醜數序列實際上就是這 3 個有序序列對的合併結果, 計算醜數序列也就是相當於 合併 3 個有序序列。

合併 3 個有序序列, 最簡單的方法就是每乙個序列都各自維護乙個指標,然後比較指標指向的元素的值, 將最小的放入最終的合併陣列中,

並將相應指標向後移動乙個元素

。 這也就是:

for

(int i=

1;i)

nums2, nums3, nums5 中是存在重複的解的, 例如 nums2[2] == 3*2, nums3[1] == 2*3 都計算出了 6 這個結果, 所以在合併 3 個有序陣列的過程中, 還需要跳過相同的結果, 這也就是為什麼在比較的時候, 需使用 3 個並列的 if… if… if… 而不是 if… else if… else 這種結構的原因。 當比較到元素 6 時, if (res[i] == res[p2] * 2)…if (res[i] == res[p3] * 3)… 可以同時指向 nums2, nums3 中 元素 6 的下乙個元素.

class

solution

return res[index-1]

;}};

題目描述

在乙個字串(0<=字串長度<=10000,全部由字母組成)中找到第乙個只出現一次的字元,並返回它的位置, 如果沒有則返回

-1(需要區分大小寫).(從0開始計數)

解題思路:

利用雜湊表,統計每個字元出現的次數即可

class

solution

for(

int j=

0;jsize()

;j++

)return-1

;}};

題目描述

在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數p。並將p對1000000007取模的結果輸出。

即輸出p%1000000007

解題思路:

利用歸併排序 時間複雜度為o(nlongn)

class

solution

else

}while

(i<=mid)

while

(j<=r)

for(i=l,k=

0;i<=r;i++

,k++)}

void

merge_sort

(vector<

int>

&arr,vector<

int>

&tmp,

int l,

int r,

int&res)

int mid=l+

((r-l)

>>1)

;merge_sort

(arr,tmp,l,mid,res)

;merge_sort

(arr,tmp,mid+

1,r,res)

;merge_

(arr,tmp,l,mid,r,res);}

intinversepairs

(vector<

int> data)

};

劍指offer全套解答 劍指offer 1 5

1.二維陣列中的查詢 在乙個二維陣列中 每個一維陣列的長度相同 每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。public class solution int n array 0 length i...

劍指offer全套解答 劍指offer 36 45

36.兩個鍊錶的第乙個公共節點 輸入兩個鍊錶,找出它們的第乙個公共結點。注意因為傳入資料是鍊錶,所以錯誤測試資料的提示是用其他方式顯示的,保證傳入資料是正確的 public class solution return p 37.數字在排序陣列 現的次數 統計乙個數字在公升序陣列 現的次數。publi...

劍指offer全套解答 劍指offer 46 55

46.孩子們的遊戲 圓圈中最後剩下的數 每年六一兒童節,牛客都會準備一些小禮物去看望孤兒院的小朋友,今年亦是如此。hf作為牛客的資深元老,自然也準備了一些小遊戲。其中,有個遊戲是這樣的 首先,讓小朋友們圍成乙個大圈。然後,他隨機指定乙個數m,讓編號為0的小朋友開始報數。每次喊到m 1的那個小朋友要出...