题目:给一个长度为 n 的数组,数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组[1,2,3,2,2,2,5,4,2]。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。
解法一:用一个Map装下每个数出现的次数。
import java.util.*;
public class Solution {
public int MoreThanHalfNum_Solution(int [] array) {
HashMap results = new HashMap<>();
for(int i = 0;i keys = results.keySet();
for(Integer i:keys){
if(results.get(i)>array.length/2)
return i;
}
return -1;
}
}
解法二:数组可以看成两种数,一种是最多的数,另一种是其他,用最多的数每次碰到不一样的数,两数“同归于尽”,最终留下的就是最多的。
具体实现:用current 表示当前数,count 表示当前数出现的次数。碰到相同的数,count增加,碰到不同的数,count减少,减到count为0,更换当前current的值。
import java.util.*;
public class Solution {
public int MoreThanHalfNum_Solution(int [] array) {
int current = array[0];
int count = 1;
for(int i=1;i


