- 题目:
数组中出现次数超过一半的数字 - 描述:
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
/**
* 题目:
* 数组中出现次数超过一半的数字
*
* 描述:
* 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。
* 由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
*/
public class MoreThanHalf {
public static void main(String[] args) {
int[] array = {1, 2, 3, 2, 2, 2, 5, 4, 2};
System.out.println(MoreThanHalfNum2(array));
}
/**
* 方案一:
* https://blog.nowcoder.net/n/f8bf65dab8094a23bb0a44651013ba43?f=comment
*
* @param array
* @return
*/
private static int MoreThanHalfNum(int[] array) {
if (array == null || array.length == 0) {
return 0;
}
int preValue = array[0];//用来记录上一次的记录
int count = 1;//preValue出现的次数(相减之后)
for (int i = 1; i < array.length; i++) {
if (array[i] == preValue) {
count++;
} else {
count--;
if (count == 0) {
preValue = array[i];
count = 1;
}
}
}
int num = 0;//判断是否有超过一半的数
for (int i1 : array) {
if (i1 == preValue) {
num++;
}
}
return (num > array.length / 2) ? preValue : 0;
}
/**
* 方案二:使用哈希表
*
* @param array
* @return
*/
private static int MoreThanHalfNum2(int[] array) {
if (array == null || array.length == 0) {
return 0;
}
//key代表数组中的数值,value代表出现的次数
Map<Integer, Integer> hashMap = new HashMap<>();
//将数组中的数据转移到map中
for (int i1 : array) {
if (hashMap.containsKey(i1)) {
int num = hashMap.get(i1);
hashMap.put(i1, ++num);
} else {
hashMap.put(i1, 1);
}
}
Map.Entry<Integer, Integer> mostEntry = null;
//遍历map 找出出现次数最多的Entry
for (Map.Entry<Integer, Integer> entry : hashMap.entrySet()) {
if (mostEntry == null) {
mostEntry = entry;
}
if (entry.getValue() > mostEntry.getValue()) {
mostEntry = entry;
}
}
if (mostEntry == null) {
return 0;
}
int mostValue = mostEntry.getValue();
return mostValue > array.length / 2 ? mostEntry.getKey() : 0;
}
}
执行结果:
2