題目描述
陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為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的那個小朋友要出...