268. 缺失数字

题目描述

在这里插入图片描述

思路一

排序,不多解释,估计都能想到。

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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值