数组中的重复数字 | 豆包MarsCode AI刷题

57 阅读3分钟

题目描述

给定一个整数数组 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  # 理论上不会执行到这里

知识总结

  • 数据结构的选择:根据问题特点选择合适的数据结构,例如本例中使用集合快速判断元素是否已存在。
  • 空间复杂度优化:当需要节省额外空间时,考虑原地操作的可能性。
  • 算法思维:培养对不同算法的理解和应用能力,能够灵活变换思路解决问题。

学习计划

  1. 基础巩固:首先确保掌握基本的数据结构和算法知识,比如数组、链表、栈、队列等。
  2. 每日一题:每天至少完成一道题目,从简单到困难逐步提升难度。
  3. 错题分析:定期回顾错题,理解错误原因,并尝试用不同的方法重新解答。
  4. 专题突破:针对某一类特定类型的问题集中练习,如二分查找、动态规划等。
  5. 社区交流:加入编程社区,与其他学习者交流心得,获取更多解题思路。

工具运用

  • 利用豆包MarsCode AI反馈:在提交代码后,仔细阅读AI提供的反馈信息,了解自己的不足之处并进行改进。
  • 结合在线资源:除了豆包MarsCode平台外,还可以参考LeetCode、GitHub项目等资源,丰富自己的学习资料库。
  • 笔记整理:使用Evernote、OneNote等工具记录学习过程中遇到的新知识点和技术点,方便日后复习。

通过以上方法,不仅能够提高编程技能,还能培养良好的学习习惯,为未来的学习打下坚实的基础。希望这些建议对你有所帮助!