1. 问题解析:找出数组中唯一的"单身数字"
这道题目来自LeetCode经典问题,要求在一个非空整数数组中找到那个只出现一次的数字,其他数字都恰好出现两次。看似简单的问题背后,其实考察了程序员对算法效率和数据结构的理解深度。
问题的核心约束条件有两个:
- 必须设计线性时间复杂度(O(n))的算法
- 只能使用常量额外空间(O(1))
提示:在实际面试中,面试官给出这样的约束条件时,通常是在暗示存在更优解,而不仅仅是考察基础解法。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 基础解法:哈希表计数法
2.1 哈希表实现思路
哈希表解法是最直观的解决方案,就像我们日常生活中记账一样:
- 准备一个空的"记账本"(哈希表)
- 遍历数组中的每个数字
- 如果数字不在记账本中,就记录下来并标记出现1次
- 如果数字已经存在,就把出现次数加1
- 最后遍历记账本,找出出现次数为1的数字
java复制public int singleNumber(int[] nums) {
Map<Integer, Integer> countMap = new HashMap<>();
// 统计每个数字的出现次数
for (int num : nums) {
countMap.put(num, countMap.getOrDefault(num, 0) + 1);
}
// 找出出现一次的数字
for (Map.Entry<Integer, Integer> entry : countMap.entrySet()) {
if (entry.getValue() == 1) {
return entry.getKey();
}
}
return -1; // 题目保证有解,这里不会执行到
}
2.2 复杂度分析
- 时间复杂度:O(n),需要遍历数组两次(一次统计,一次查找)
- 空间复杂度:O(n),最坏情况下需要存储n/2+1个键值对
2.3 适用场景与局限性
哈希表解法虽然直观易懂,但在实际应用中存在以下问题:
- 需要额外的存储空间,当数据量很大时可能造成内
