题目描述
思路一
排序,不多解释,估计都能想到。
func missingNumber(nums []int) int {
sort.Ints(nums)
if nums[len(nums) - 1] != len(nums) {
return len(nums)
}
if nums[0] != 0 {
return 0
}
for i := 1; i < len(nums); i++ {
tmp := (nums[i - 1] + 1)
if nums[i] != tmp {
return tmp
}
}
return -1
}
思路二
借用哈希表
不多说,估计也都能想到
func missingNumber(nums []int) int {
m := make(map[int]int)
for i := 0; i < len(nums)+1; i++ {
m[i] = 0
}
for _, v := range nums {
m[v] = 1
}
for i, v := range m {
if v == 0 {
return i
}
}
return -1
}
思路三
位运算 — 异或操作
异或运算(XOR)满足结合律,并且对一个数进行两次完全相同的异或运算会得到原来的数,因此我们可以通过异或运算找到缺失的数字。
我们知道数组中有 n 个数,并且缺失的数在 [0…n]中。因此我们可以先得到 [0…n]的异或值,再将结果对数组中的每一个数进行一次异或运算。未缺失的数在 [0…n]和数组中各出现一次,因此异或后得到 0。而缺失的数字只在 [0…n]中出现了一次,在数组中没有出现,因此最终的异或结果即为这个缺失的数字。
在编写代码时,由于 [0…n]恰好是这个数组的下标加上 nn,因此可以用一次循环完成所有的异或运算,例如下面这个例子。
func missingNumber(nums []int) int {
miss := len(nums)
for i := 0; i < len(nums); i++ {
miss ^= (i ^ nums[i])
}
return miss
}
参考:https://leetcode-cn.com/problems/missing-number/solution/que-shi-shu-zi-by-leetcode/