数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字
- 定义变量
- 一个是要找的数
- 一个是出现的次数
- 遍历数组找到相同的次数++否则抵消次数--
- 最后结束的数就是可能大于数组一半的数
1 |
2 |
2 |
5 |
4 |
5 |
5 |
5 |
5 |
6 |
1 1 2 1 22 21 41 51 52 53 54 53
public static int moreThanHalfNum(int[] numbers) {
// 用于记录出现次数大于数组一半的数
int result = numbers[0];
// 于当前记录的数不同的数的个数
int count = 1;
// 从第二个数开始向后找
for (int i = 1; i < numbers.length; i++) {
// 如果记数为0
if (count == 0) {
// 重新记录一个数,假设它是出现次数大于数组一半的
result = numbers[i];
// 记录统计值
count = 1;
}
// 如果记录的值与统计值相等,记数值增加
else if (result == numbers[i]) {
count++;
}
// 如果不相同就减少,相互抵消
else {
count--;
}
}
count = 0;
for (int number : numbers) {
if (result == number) {
count++;
}
}
// 如果出现次数大于数组的一半就返回对应的值
if (count > numbers.length / 2) {
return result;
}
}