问题描述
小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
我的题解
def solution(array):
from collections import Counter
cnt = Counter(array)
target = max(cnt.values())
for x, y in cnt.items():
if y == target:
return x
if __name__ == "__main__":
# Add your test cases here
print(solution([1, 3, 8, 2, 3, 1, 3, 3, 3]) == 3)
豆包提示
代码提示
-
理解问题:题目要求找到数组中出现次数超过一半的数字。这意味着这个数字的出现次数必须大于数组长度的一半。
-
数据结构选择:你已经使用了
collections.Counter来统计每个数字的出现次数,这是一个很好的选择。 -
算法步骤:
- 使用
Counter统计每个数字的出现次数。 - 找到出现次数最多的数字。
- 检查这个数字的出现次数是否超过数组长度的一半。
- 使用
-
代码实现:
- 你已经正确地使用了
Counter来统计每个数字的出现次数。 - 你使用了
max(cnt.values())来找到最大的出现次数,但这里需要确保这个最大出现次数确实超过了数组长度的一半。
- 你已经正确地使用了
代码框架
def solution(array):
from collections import Counter
cnt = Counter(array)
# 找到出现次数最多的数字
max_count = max(cnt.values())
# 检查这个数字的出现次数是否超过数组长度的一半
if max_count > len(array) / 2:
for x, y in cnt.items():
if y == max_count:
return x
else:
# 这里需要处理如果没有任何数字出现次数超过一半的情况
return None # 或者抛出一个异常,根据题目要求来决定
if __name__ == "__main__":
# Add your test cases here
print(solution([1, 3, 8, 2, 3, 1, 3, 3, 3]) == 3)
关键步骤
- 检查出现次数是否超过一半:在返回结果之前,确保最大出现次数确实超过了数组长度的一半。
- 处理特殊情况:如果没有任何数字出现次数超过一半,需要处理这种情况。
我的思考
感觉还能再优化一下
def solution(array):
from collections import Counter
cnt = Counter(array)
# 找到出现次数最多的数字
for num, count in cnt.items():
if count > len(array) / 2:
return num
# 如果没有找到符合条件的数字,返回 None 或者抛出异常
return None
if __name__ == "__main__":
# Add your test cases here
print(solution([1, 3, 8, 2, 3, 1, 3, 3, 3]) == 3)
关键优化点
-
直接检查出现次数:
- 在遍历
Counter的过程中,直接检查每个数字的出现次数是否超过数组长度的一半。 - 如果找到符合条件的数字,立即返回,避免不必要的后续操作。
- 在遍历
-
简化逻辑:
- 去掉了
max操作,直接在遍历Counter的过程中进行检查。
- 去掉了
时间复杂度
- 优化后的代码仍然是
O(n),但减少了不必要的操作,提高了效率。
代码简洁性
- 代码逻辑更加清晰,减少了冗余代码。