题目描述

给定一个包含 0, 1, 2, …, n 中 n 个数的序列,找出 0 .. n 中没有出现在序列中的那个数

示例1:

输入: [3,0,1]
输出: 2

示例2:

输入: [9,6,4,2,3,5,7,0,1]
输出: 8

说明:

1.一定是从0开始,不能是[2,4,5] 2.你的算法应具有线性时间复杂度。你能否仅使用额外常数空间来实现?

使用等差数列求和公式

因为是从0开始,所以我们可以假设0->n是连续的,那么s=1/2 * (n+1) * (0+n)

s减去数组中的每一个元素,得到的一定是缺少的哪一位数

func missingNumber2(_ nums: [Int]) -> Int {
    var res = (nums.count + 1) * nums.count/2
    for num in nums {
        res -= num
    }
    return res
}

或者

func missingNumber(_ nums: [Int]) -> Int {
    var res = 0
    let count = nums.count
    for i in 0..<count+1 {
        res += i
        if i < count {
            res -= nums[i]
        }
    }
    return res
}

使用异或

异或特点:自己^自己=0 ,自己^0=自己

核心思路:nums所有数字相加S1,0到n之间完整的数组相加S2,S2-S1=缺失数字 ,S2^S1=缺失数字

func missingNumber3(_ nums: [Int]) -> Int {
    let res = (nums.count + 1) * nums.count/2
    var sum = 0
    for num in nums {
        sum += num
    }
    return res^sum
}