集合 S 包含从1到 n 的整数。不幸的是,因为数据错误,导致集合里面某一个元素复制了成了集合里面的另外一个元素的值,导致集合丢失了一个整数并且有一个元素重复。
给定一个数组 nums 代表了集合 S 发生错误后的结果。你的任务是首先寻找到重复出现的整数,再找到丢失的整数,将它们以数组的形式返回。
示例 1:
输入: nums = [1,2,2,4]
输出: [2,3]
注意
- 给定数组的长度范围是 [2, 10000]。
- 给定的数组是无序的。
golang语言版
func findErrorNums(nums []int) []int {
// n == len(nums)
// 而 nums 的数字属于 [1,n],那么
// 对于每一个 nums[abs(nums[i])-1] 中的数取反
// 操作过程中,
// 取反前,nums[abs(nums[i])-1] 已经是负数的话,说明 abs(nums[i]) 是重复的数
// 操作结束后,
// nums[i] > 0,说明 nums[i] 没有被取反过, i+1 是丢失的数
dup := 0
for i := 0; i < len(nums); i++ {
n := abs(nums[i])
if nums[n-1] < 0 {
dup = n
// NOTICE: nums[n-1]<0 的时候,不能再取反为正数了
} else {
nums[n-1] = -nums[n-1]
}
}
mis := 0
for i, v := range nums {
if v > 0 {
mis = i + 1
break
}
}
return []int{dup, mis}
}
func abs(a int) int {
if a > 0 {
return a
}
return -a
}