leetcode不存在编号3678的题目,实际应为第41题“first missing positive”;其核心是原地哈希:将1~n的数放到对应下标i-1处,遍历找首个nums[i]≠i+1的位置,返回i+1或n+1。

LeetCode 上没有编号为 3678 的题目。目前(截至 2024 年)LeetCode 题目总数约 3500+,最高题号在 3400 左右,且官方未发布 3678 号题。
可能的情况与对应解法
你很可能指的是经典题目:LeetCode 41. First Missing Positive(第一个缺失的正整数),它要求在 O(n) 时间、O(1) 空间 内找出数组中最小的未出现正整数(即最小的 missing positive)。这是面试高频题,常被误记为“3678”等相近数字。
以下是该题的 Go 语言标准解法(原地哈希):
核心思路:用数组下标当哈希表键
把值为 i 的正整数尽量放到索引 i-1 的位置上(例如 1→index 0,2→index 1,…)。遍历完成后,第一个不满足 nums[i] == i+1 的位置,其应有值 i+1 就是答案。
Go 实现(含详细注释)
// firstMissingPositive 返回最小未出现的正整数
func firstMissingPositive(nums []int) int {
n := len(nums)
// 第一遍:把每个 1~n 的数放到正确位置
for i := 0; i // nums[i] 应该在位置 nums[i]-1,但需确保目标位置合法且值不重复
for nums[i] > 0 && nums[i] // 交换:把 nums[i] 放到索引 nums[i]-1 处
nums[i], nums[nums[i]-1] = nums[nums[i]-1], nums[i]
}
}
// 第二遍:找第一个位置 i 满足 nums[i] != i+1
for i := 0; i if nums[i] != i+1 {
return i + 1
}
}
// 所有 1~n 都存在 → 答案是 n+1
return n + 1
}
关键细节说明
- 循环内 while 是必须的:一次 swap 后,新换来的数可能仍需继续放置(比如换来了 3,而当前 i=0,3 应去 index 2)
- 条件 nums[nums[i]-1] != nums[i] 防止死循环:避免因重复值(如 [1,1])导致无限交换
- 只处理 1~n 范围内的数:小于等于 0 或大于 n 的数无法放入有效下标,直接跳过,最终不影响结果
- 时间复杂度仍是 O(n):每个数最多被换入正确位置一次,总交换次数 ≤ n
如果本意不是 LeetCode 41,请确认题号或提供题目描述(如链接或原文),我可以为你精准实现对应 Go 解法。










