问题描述
小红在和小伙伴玩一个数组游戏,每个同学都会给出一个数字。已知在输入的数组中,某个数字的出现次数超过了数组总长度的一半。现在需要编写一个程序,找出这个数字。
输入输出
输入:一个整数数组 array,长度为 nnn,保证一定存在一个出现次数超过一半的数字。
输出:找到的数字。如果没有符合条件的数字(虽然题目保证不会出现这种情况),返回 0。
示例:
示例 1: 输入:
array=[1,3,8,2,3,1,3,3]array = [1, 3, 8, 2, 3, 1, 3, 3]array=[1,3,8,2,3,1,3,3]
输出:
333
示例 2: 输入:
array=[5,5,5,1,2,5,5]array = [5, 5, 5, 1, 2, 5, 5]array=[5,5,5,1,2,5,5]
输出:
555
示例 3: 输入:
array=[9,9,9,9,8,9,8,8,8]array = [9, 9, 9, 9, 8, 9, 8, 8, 8]array=[9,9,9,9,8,9,8,8,8]
输出:
999
解题思路
1. 基本思路
要找出一个数字在数组中出现的次数超过数组长度的一半,可以通过以下方法:
- 遍历数组,记录每个数字出现的次数;
- 找到出现次数超过 n/2n / 2n/2 的数字。
2. 使用哈希表统计
通过哈希表(Python 中用字典实现),统计数组中每个数字的出现次数。遍历完成后,再次检查哈希表中的数字,找到出现次数超过数组长度一半的数字。
3. 特殊保证
题目保证一定存在一个符合条件的数字,所以可以直接返回找到的数字,无需考虑异常情况。
代码实现
def solution(array):
# 初始化一个字典存储每个数字的出现次数
count_dict = {}
# 遍历数组中的每个元素
for num in array:
# 如果该元素已经在字典中,则将出现次数加1
if num in count_dict:
count_dict[num] += 1
else:
# 如果该元素还不在字典中,则将其加入字典,并将出现次数置为1
count_dict[num] = 1
# 计算数组长度的一半
half_length = len(array) // 2
# 遍历字典,找到出现次数超过数组长度一半的数字
for num, count in count_dict.items():
if count > half_length:
return num
# 如果没有找到符合条件的数字,返回0(虽然题目保证一定存在这样的数字)
return 0
示例解析
示例 1
输入:
array=[1,3,8,2,3,1,3,3]array = [1, 3, 8, 2, 3, 1, 3, 3]array=[1,3,8,2,3,1,3,3]
过程:
- 遍历数组并统计出现次数,结果为:
{1: 2, 3: 4, 8: 1, 2: 1}; - 数组长度为 n=8n = 8n=8,一半为 n/2=4n/2 = 4n/2=4;
- 数字
3出现次数为 4,超过一半,输出3。
示例 2
输入:
array=[5,5,5,1,2,5,5]array = [5, 5, 5, 1, 2, 5, 5]array=[5,5,5,1,2,5,5]
过程:
- 统计出现次数:
{5: 5, 1: 1, 2: 1}; - 数组长度为 n=7n = 7n=7,一半为 n/2=3.5n/2 = 3.5n/2=3.5;
- 数字
5出现次数为 5,超过一半,输出5。
示例 3
输入:
array=[9,9,9,9,8,9,8,8,8]array = [9, 9, 9, 9, 8, 9, 8, 8, 8]array=[9,9,9,9,8,9,8,8,8]
过程:
- 统计出现次数:
{9: 5, 8: 4}; - 数组长度为 n=9n = 9n=9,一半为 n/2=4.5n/2 = 4.5n/2=4.5;
- 数字
9出现次数为 5,超过一半,输出9。
AI 使用
在解题过程中,MarsCode AI 的帮助主要体现在以下几个方面:
-
快速生成基础代码:
- 提供了完整的哈希表统计方法;
- 明确了关键步骤(如遍历数组和字典)。
-
逻辑梳理:
- AI 自动提供了解题的基本逻辑,尤其在保证出现次数超过一半时,可以避免过度检查和边界情况。
-
代码模块化:
- AI 给出的代码清晰地分为统计、条件判断和结果返回,易于理解和调试。
反思与不足:
- 缺乏优化建议:
AI 的代码思路虽然直接,但未提及更高效的解法(如摩尔投票法),无法降低空间复杂度。 - 边界情况:
如果需要处理未满足条件的情况(如非保证存在多数元素的版本),需要额外的人工补充。
进一步优化:
- 摩尔投票法:使用一种基于计数的算法,可以将空间复杂度从 O(n)O(n)O(n) 降低到 O(1)O(1)O(1),但适用于题目明确存在超过一半元素的情况。
- 代码优化:在写入和更新统计值时,利用更简洁的操作(如
collections.Counter),进一步提升代码可读性。