问题描述
班上有一位同学从班级中抽取了一些同学,每位同学都会给出一个数字。已知在这些数字中,某个数字的出现次数超过了数字总数的一半。现在需要你帮助班上的这位同学来找到这个数字。
测试样例
样例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
解题思路
-
初始化:我们需要两个变量,一个用于存储当前候选的数字(
candidate),另一个用于存储该数字的计数(count)。 -
遍历数组:对于数组中的每一个数字:
- 如果
count为0,将当前数字设为candidate,并将count设为1。 - 如果当前数字与
candidate相同,增加count。 - 如果当前数字与
candidate不同,减少count。
- 如果
-
验证:遍历结束后,
candidate就是可能的答案。我们需要再次遍历数组,确认candidate的出现次数是否确实超过一半。
代码提示
你可以根据上述思路,在solution方法中实现这个算法。以下是一些代码提示:
java
public class Main {
public static int
solution(int[]
array) {
// 初始化候选数
字和计数
int candidate
= 0;
int count = 0;
// 遍历数组,找
出候选数字
for (int num
: array) {
if (count
== 0) {
// 如
果计数
为0,更
新候选
数字
candid
ate =
num;
count
= 1;
} else if
(num ==
candidate)
{
// 如
果当前
数字与
候选数
字相
同,增
加计数
count
++;
} else {
// 如
果当前
数字与
候选数
字不
同,减
少计数
count-
-;
}
}
// 验证候选数字
的出现次数是否超
过一半
count = 0;
for (int num
: array) {
if (num
==
candidate)
{
count
++;
}
}
// 如果候选数字
的出现次数超过一
半,返回候选数字
if (count >
array.
length / 2) {
return
candidate;
} else {
// 如果没有
数字出现次数
超过一半,返
回-1或其他
错误码
return -1;
}
}
public static
void main(String
[] args) {
// 添加你的测试
用例
System.out.
println
(solution(new
int[]{1, 3,
8, 2, 3, 1,
3, 3, 3}) ==
3);
}
}
关键步骤
- 初始化候选数字和计数:
int candidate = 0; int count = 0; - 遍历数组,找出候选数字:根据
count的变化更新candidate。 - 验证候选数字的出现次数:再次遍历数组,确认
candidate的出现次数是否超过一半。
解题思路
-
初始化:我们需要两个变量,一个用于存储当前候选的数字(
candidate),另一个用于存储该数字的计数(count)。 -
遍历数组:对于数组中的每一个数字:
- 如果
count为0,将当前数字设为candidate,并将count设为1。 - 如果当前数字与
candidate相同,增加count。 - 如果当前数字与
candidate不同,减少count。
- 如果
-
验证:遍历结束后,
candidate就是可能的答案。我们需要再次遍历数组,确认candidate的出现次数是否确实超过一半。
代码提示
你可以根据上述思路,在solution方法中实现这个算法。以下是一些代码提示:
java
public class Main {
public static int
solution(int[]
array) {
// 初始化候选数
字和计数
int candidate
= 0;
int count = 0;
// 遍历数组,找
出候选数字
for (int num
: array) {
if (count
== 0) {
// 如
果计数
为0,更
新候选
数字
candid
ate =
num;
count
= 1;
} else if
(num ==
candidate)
{
// 如
果当前
数字与
候选数
字相
同,增
加计数
count
++;
} else {
// 如
果当前
数字与
候选数
字不
同,减
少计数
count-
-;
}
}
// 验证候选数字
的出现次数是否超
过一半
count = 0;
for (int num
: array) {
if (num
==
candidate)
{
count
++;
}
}
// 如果候选数字
的出现次数超过一
半,返回候选数字
if (count >
array.
length / 2) {
return
candidate;
} else {
// 如果没有
数字出现次数
超过一半,返
回-1或其他
错误码
return -1;
}
}
public static
void main(String
[] args) {
// 添加你的测试
用例
System.out.
println
(solution(new
int[]{1, 3,
8, 2, 3, 1,
3, 3, 3}) ==
3);
}
}
关键步骤
- 初始化候选数字和计数:
int candidate = 0; int count = 0; - 遍历数组,找出候选数字:根据
count的变化更新candidate。 - 验证候选数字的出现次数:再次遍历数组,确认
candidate的出现次数是否超过一半。