劍指offer二十八之陣列中出現次數超過一半的數字

2021-09-07 15:10:16 字數 1277 閱讀 5730

一、題目

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

二、思路

解法一:

陣列排序後,如果符合條件的數存在,則一定是陣列中間那個數。(比如:1,2,2,2,3;或2,2,2,3,4;或2,3,4,4,4等等)。

解法二:

採用陣地攻守的思想:

(1)第乙個數字作為第乙個士兵,守陣地;count = 1;

(2)遇到相同元素,count++;

(3)遇到不相同元素,即為敵人,同歸於盡,count--;當遇到count為0的情況,又以新的i值作為守陣地的士兵,繼續下去,到最後還留在陣地上的士兵,有可能是主元素。

(4)再加一次迴圈,記錄這個士兵的個數看是否大於陣列長度的一半即可。

三、**

解法一**:

public

class

solution

//排序

arrays.sort(array);

//取中間的值

int val=array[(array.length-1)/2];

int count=0;

//統計中間數字出現的次數

for(int i=0;i)

}//返回結果

return count>(array.length/2)?val:0;}}

view code

解法二**:

/**

*  採用陣地攻守的思想:

*   (1)第乙個數字作為第乙個士兵,守陣地;count = 1;

*   (2)遇到相同元素,count++;

*   (3)遇到不相同元素,即為敵人,同歸於盡,count--;當遇到count為0的情況,又以新的i值作為守陣地的士兵,繼續下去,到最後還留在陣地上的士兵,有可能是主元素。

*   (4)再加一次迴圈,記錄這個士兵的個數看是否大於陣列長度的一半即可。 */

public

class

solution

if (array[i] ==num)

else

}//再加一次迴圈,記錄這個士兵的個數看是否大於陣列長度的一半即可

int count2=0;

for(int i=0;i)

}//返回結果

return count2>(array.length/2)? num:0;}}

view code

劍指offer第二十八題

題目描述 陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為9的陣列。由於數字2在陣列 現了5次,超過陣列長度的一半,因此輸出2。如果不存在則輸出0。思路 看到這個題目,我腦子裡第乙個蹦出來的思路是用樹來解決,因為這個題目是要記錄鍵對應的值,記錄完了過後再去查詢鍵對應的...

《劍指offer》第二十八題(對稱的二叉樹)

面試題28 對稱的二叉樹 題目 請實現乙個函式,用來判斷一棵二叉樹是不是對稱的。如果一棵二叉樹和 它的映象一樣,那麼它是對稱的。include include binarytree.h bool issymmetrical binarytreenode proot1,binarytreenode p...

二十八 python3 之random

1 隨機小數 import random print random.random 隨機大於0 且小於1 之間的小數 0.9441832228391154 print random.uniform 0,9 隨機乙個大於0小於9的小數 結果 7.646583891572416 2 隨機整數 print ...