问题描述
小R最近迷上了这个小游戏。这个游戏中,每一轮都会给出两张非常相似的照片,任务是指出它们之间所有的不同之处。
有一天,小R玩游戏时经过小S身边,瞄到她正盯着一些数字发呆。小R随手指了一个数字,并说这个数字只出现了一次。小S经过仔细验证,发现小R是对的。
为了进一步测试小R的能力,小S设计了一份问卷,包含若干道题目,每道题目有一些数字,要求小R快速回答:在每道题中,最小的一个只出现一次的数字是什么?
由于题目很多,小S无法手动核对所有答案,她希望你能够帮忙实现这个功能。
如果每个数字都出现了多于1次,那么返回-1。
测试样例
样例1:
输入:
n = 3,nums = [6, 6, 6]
输出:-1
样例2:
输入:
n = 3,nums = [6, 9, 6]
输出:9
样例3:
输入:
n = 5,nums = [1, 2, 2, 3, 3]
输出:1
题目看着很长很多,但是实际看完并没有考察很多内容,初步思路如下:
基本思路
-
统计每个数字的出现次数:
- 我们需要知道每个数字在列表中出现的次数。可以使用一个字典(哈希表)来记录每个数字的计数。
-
找出只出现一次的数字:
- 在统计完成后,我们遍历字典,找出那些只出现一次的数字。
-
找出最小值:
- 在找到只出现一次的数字后,我们从这些数字中找出最小的那个。
-
处理特殊情况:
- 如果没有找到任何只出现一次的数字,我们需要返回
-1
。
- 如果没有找到任何只出现一次的数字,我们需要返回
这时再结合AI刷题的豆包提供的思路提示:
问题理解
我们需要在一个整数列表中找到最小的、只出现一次的数字。如果所有数字都出现了多次,则返回 -1
。
数据结构选择
- 字典(Dictionary) :用于统计每个数字出现的次数。
- 最小值变量:用于记录当前找到的最小只出现一次的数字。
算法步骤
- 统计数字出现次数:遍历列表,使用字典记录每个数字出现的次数。
- 查找最小只出现一次的数字:再次遍历字典,找到出现次数为1的最小数字。
- 返回结果:如果没有找到只出现一次的数字,返回
-1
;否则返回找到的最小数字。
具体步骤
- 初始化字典:用于存储每个数字的出现次数。
- 遍历列表:更新字典中每个数字的出现次数。
- 初始化最小值变量:设置为正无穷大(
float('inf')
)。 - 遍历字典:找到出现次数为1的最小数字,更新最小值变量。
- 返回结果:根据最小值变量的值返回结果。
出乎意料地一遍过代码:
def solution(n: int, nums: list) -> int:
count_dict = {}
for num in nums:
if num in count_dict:
count_dict[num] += 1
else:
count_dict[num] = 1
min_once_num = float('inf')
for num, count in count_dict.items():
if count == 1:
min_once_num = min(min_once_num, num)
if min_once_num == float('inf'):
return -1
else:
return min_once_num
if __name__ == '__main__':
print(solution(n = 3, nums = [6, 6, 6]) == -1)
print(solution(n = 3, nums = [6, 9, 6]) == 9)
print(solution(n = 5, nums = [1, 2, 2, 3, 3]) == 1)