找出整形数组中占比超过一半的数的问题描述 小R从班级中抽取了一些同学,每位同学都会给出一个数字。已知在这些数字中,某个数字的出现次数超过了数字总数的一半。现在需要你帮助小R找到这个数字。 测试样例 样例1: 输入:array = [1, 3, 8, 2, 3, 1, 3, 3, 3] 输出:3 样例2: 输入:array = [5, 5, 5, 1, 2, 5, 5] 输出:5 样例3: 输入:array = [9, 9, 9, 9, 8, 9, 8, 8] 输出:9
完整代码
public class Main {
public static int solution(int[] array) {
int candidate = 0; // 初始化候选元素
int count = 0; // 初始化计数器
// 遍历数组
for (int num : array) {
// 如果计数器为0,更新候选元素
if (count == 0) {
candidate = num;
count = 1;
}
// 如果当前元素与候选元素相同,计数器加1
else if (num == candidate) {
count++;
}
// 如果当前元素与候选元素不同,计数器减1
else {
count--;
}
}
// 返回候选元素
return candidate;
}
public static void main(String[] args) {
// 测试用例
System.out.println(solution(new int[]{1, 3, 8, 2, 3, 1, 3, 3, 3}) == 3);
}
}
代码解释
-
类和方法定义:
public class Main:定义了一个公共类Main。public static int solution(int[] array):定义了一个公共静态方法solution,接受一个整数数组array作为参数,并返回一个整数。
-
变量初始化:
int candidate = 0;:初始化一个变量candidate,用于存储当前的候选元素。初始值为0。int count = 0;:初始化一个变量count,用于记录候选元素的出现次数。初始值为0。
-
遍历数组:
for (int num : array):使用增强型for循环遍历数组array中的每一个元素,将其赋值给变量num。
-
更新候选元素和计数器:
if (count == 0):如果count为0,表示当前没有候选元素,或者之前的候选元素已经被抵消。candidate = num;:将当前元素num设为候选元素。count = 1;:将计数器count设为1。
else if (num == candidate):如果当前元素num与候选元素candidate相同。count++;:将计数器count加1。
else:如果当前元素num与候选元素candidate不同。count--;:将计数器count减1。
-
返回结果:
return candidate;:遍历结束后,candidate就是我们要找的多数元素,将其返回。
-
主方法:
public static void main(String[] args):定义了程序的入口点main方法。System.out.println(solution(new int[]{1, 3, 8, 2, 3, 1, 3, 3, 3}) == 3);:调用solution方法,并传入一个测试用例[1, 3, 8, 2, 3, 1, 3, 3, 3],预期输出为3。然后打印结果。
测试用例
- 在
main方法中,我们使用了一个测试用例[1, 3, 8, 2, 3, 1, 3, 3, 3],预期输出为3。
总结
- 该算法通过遍历数组,利用计数器
count和候选元素candidate来找到出现次数超过数组长度一半的元素。 - 最终返回的
candidate就是我们要找的多数元素。