3 7 實戰解題 哪個數字超過了一半

2021-10-02 00:04:26 字數 1666 閱讀 4044

陣列中有乙個數字出現的次數超過了陣列長度的一半,找出這個數字。

分析:因為這個數字k出現次數超過了n/2,注意利用這個特性這意味著:

解法1思路

hash統計,hashmap沒學,之後再說

解法2思路

排序後返回arr[n/2],時間複雜度為快排的時間複雜度o(nlgn)

解法3思路與上一題找k類似,其實不需要將全部陣列排好序,進行一次快排的劃分即可,此時arr[n/2]即為所求的數, 時間複雜度為o(n)

解法4思路如果乙個數出現的次數超過陣列一半的長度,那麼就是說出現的次數比其他所有數字出現的次數還要多。

debug的過**是艱辛啊┭┮﹏┭┮

因為要找的數字出現的次數比其他所有的數字出現的次數之和要大,所以遍歷完陣列,最後必然count>=1, 並且value的值就是要找的值

**int findk(int* arr,int arrlen){

int value=arr[0];

int count=1;

for(int i=1;idebug過程記錄

一開始發現網上的**是跳過之後,也沒有仔細思考可行性,就試著驗證一下把第2個元素設定為要找的值k,結果出錯了,找了另乙個出現次數比k少1次的數,就以為自己的想法是正確的,因為跳過了乙個k

於是就額外寫了個判斷語句,使得不跳過第二個數,執行結果就正確了,科十自己又想,跳過也不是只是第二個數跳過啊,自己在腦海裡演練了一下,發現使得count==0的那個陣列元素在賦值給value時都會被跳過,這就說不通了,那就應該在if(count==0)裡面改,改了又有bug!!

在網上找了兩篇部落格,這一思路的寫法都是那樣跳過的,但是驗證又有問題,差點要放棄,找第三篇部落格的時候, 看到別人還寫了驗證輸入陣列是否存在數量超過長度一般的數的**,忽然發現自己之前自己設定的陣列中重複數最高的數沒有超過陣列長度的一半!!所以才會報錯!於是把陣列修正過來,網上的**就不報錯了!但是自己的**還是有錯,正百思不得其解的時候忽然想到value=arr[i--];這種寫法是先賦值,i再-1,修正為[--i]就沒問題了

問題思路

仔細分析的話,佔一半的數字,只能在兩個變數**現:value和陣列最後乙個元素arr[arrlen-1]。只需要在遍歷陣列的時候統計最後乙個變數arr[arrlen-1]的出現次數即可,如果=arrlen/2,則它就是要找的元素,否則value就是

**int findk(int* arr,int arrlen){

int value=arr[0];

int count=1;

int countoflast=0;//統計最後的元素arr[n-1]出現的個數

for(int i=1;i[1] 乙個陣列中有乙個數字的次數超過了陣列的一半

[2] 加強版水王:找出出現次數剛好是一半的數字 l

陣列中數字超過一半的數字

題目描述 陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為9的陣列。由於數字2在陣列 現了5次,超過陣列長度的一半,因此輸出2。如果不存在則輸出0。1,利用hashmap 2,利用陣列排序 3,列舉法 暴力演算法 public class 陣列中數字超過一半的數字 e...

出現次數超過一半的數字

題目 陣列中有乙個數字出現的次數超過了陣列長度的一半,找出這個數字。乙個陣列中有很多數,現在我們要找出其中那個出現次數超過總數一半的數字,怎麼找呢?大凡當我們碰到某乙個雜亂無序的東西時,我們人的內心本質期望是希望把它梳理成有序的。所以,我們得分兩種情況來討論,無序和有序。如果無序,那麼我們是不是可以...

陣列中超過一半的數字

陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為9的陣列。由於數字2在陣列中出現了5次,超過陣列長度的一半,因此輸出2。如果不存在則輸出0。思路 定義乙個變數儲存當前元素,乙個計數器儲存次數,若次數等於0,則重新取字元。若次數大於零,遇到相同字元計數器 1,不同字元計...