LeetCode 17.04. 消失的数字

目录

异或(正解):

排序(错解):

和之差(正解):


题目来源

LeetCode 17.04. 消失的数字_第1张图片


异或(正解):

代码:

int missingNumber(vector& nums) 
{
        int n = 0;
        //先异或数字齐全时的数组
        for (int i = 0; i < nums.size() + 1; i++)
        {
            n ^= i;
        }
        //再异或数字缺失时的数组
        for (int i = 0; i < nums.size(); i++)
        {
            n ^= nums[i];
        }
        return n;
    }

分析:

利用了异或的性质:

1、交换律

2、结合律(即(a^b)^c == a^(b^c))

3、对于任何数x,都有x^x=0,x^0=x

4、自反性 A XOR B XOR B = A xor  0 = A

结果:

LeetCode 17.04. 消失的数字_第2张图片

 

 

 

 


排序(错解):

分析:

借用示例一,先排序,得到0 1 3;通过后减前是否为一或遍历对比来得出缺少的数字。

存在问题:

题目要求时间复杂度为O(N),即使是最快的排序时间复杂度也都是O(N*logN)。

思路错误。

 

 

 

 

 


和之差(正解):

代码:

int missingNumber(vector& nums) 
    {
        //计算数字齐全时的和
        int sumOverall = (nums.size() + 1) * nums.size() / 2;  
        int sumLack = 0;
        //计算数字缺少时的和
        for (int i = 0; i < nums.size(); i++)
        {
            sumLack += nums[i];
        }
        //两和之差等于缺失的数字
        return sumOverall - sumLack;
    }

分析:

数字齐全时的和减去数字缺少时的和等于缺失的数字。

结果:

LeetCode 17.04. 消失的数字_第3张图片

你可能感兴趣的:(编程刷题集锦,leetcode,算法)