题目描述
给定一个整数数组 nums,其中恰好有一个元素出现了两次,而其余所有元素都只出现一次。找出这个重复的数字。
思路
- 哈希表/集合法:遍历数组的同时使用哈希表或集合记录已经遇到过的元素,如果再次遇到某个元素,则说明该元素是重复的。
- 数学方法(异或运算) :利用异或运算的性质来解决这个问题。但本题中由于只有一个元素重复,直接使用异或可能不够直观,可以考虑其他方法如排序后查找相邻元素等。
- 原地算法:通过交换元素使其位于正确的位置上,直到发现某位置上的元素与它的索引不匹配且值相同的情况。
图解
对于原地算法:
初始状态: [2, 3, 1, 3, 4]
步骤1: 将2放到索引为2的位置上 -> [3, 2, 1, 3, 4]
步骤2: 将3放到索引为3的位置上 -> [3, 2, 1, 3, 4] 发现索引3处已有3,返回3
代码详解 (Python)
- 哈希表/集合法
python
def findDuplicate(nums):
seen = set()
for num in nums:
if num in seen:
return num
seen.add(num)
return -1 # 如果题目保证一定有重复,则此行可省略
- 原地算法
python
def findDuplicate(nums):
i = 0
while i < len(nums):
if nums[i] != i + 1:
j = nums[i] - 1
if nums[j] == nums[i]:
return nums[i]
nums[i], nums[j] = nums[j], nums[i]
else:
i += 1
return -1 # 理论上不会执行到这里
知识总结
- 数据结构的选择:根据问题特点选择合适的数据结构,例如本例中使用集合快速判断元素是否已存在。
- 空间复杂度优化:当需要节省额外空间时,考虑原地操作的可能性。
- 算法思维:培养对不同算法的理解和应用能力,能够灵活变换思路解决问题。
学习计划
- 基础巩固:首先确保掌握基本的数据结构和算法知识,比如数组、链表、栈、队列等。
- 每日一题:每天至少完成一道题目,从简单到困难逐步提升难度。
- 错题分析:定期回顾错题,理解错误原因,并尝试用不同的方法重新解答。
- 专题突破:针对某一类特定类型的问题集中练习,如二分查找、动态规划等。
- 社区交流:加入编程社区,与其他学习者交流心得,获取更多解题思路。
工具运用
- 利用豆包MarsCode AI反馈:在提交代码后,仔细阅读AI提供的反馈信息,了解自己的不足之处并进行改进。
- 结合在线资源:除了豆包MarsCode平台外,还可以参考LeetCode、GitHub项目等资源,丰富自己的学习资料库。
- 笔记整理:使用Evernote、OneNote等工具记录学习过程中遇到的新知识点和技术点,方便日后复习。
通过以上方法,不仅能够提高编程技能,还能培养良好的学习习惯,为未来的学习打下坚实的基础。希望这些建议对你有所帮助!