鸽巢理论
// 解法就是鸽子理论,代表的数字到自己的索引值去(本题是数字-1对应索引因为没有0)
// 然后那些不该在自己巢里的就是重复的,这个巢本身该有的但是没有的就是缺失的。
func findErrorNums(nums []int) []int {
if len(nums) == 0 {
return nil
}
result := make([]int,0)
for i := 0; i < len(nums);i++ {
for i != nums[i] -1 && nums[nums[i] - 1] != nums[i] {
// 这里的for是为了避免比如已经在自己的索引值上的,
// 然后第二个是自己的索引值已经有了自己一样的数字的
// 然后也不用再交换了。
swap(nums,i,nums[i]-1)
}
}
for i := range nums {
if nums[i] - 1 != i {
result = append(result,nums[i],i+1)
}
}
return result
}
func swap(nums []int,a,b int){
nums[a],nums[b] = nums[b],nums[a]
}