自用笔记26——异或运算法则

数组nums包含从0到n的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗?

注意:本题相对书上原题稍作改动

示例 1:

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

示例 2:

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/missing-number-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

一开始的代码如下,因为从0开始到n的所有整数如果没有缺失,其和为(0+n)*(n+1)/2,将缺失后数组内数字的和加起来,做差即可知道缺失的是谁。
也可以这么想,数组是从1~n的整数,其和应该为(1+n)*n/2,现用0取代其中的某个数字,求取代的是几。

int missingNumber(int* nums, int numsSize){
    int i=0,sumf=0,sumt=0;
    sumt=numsSize*(numsSize+1)/2;
    for(i=0;i<numsSize;i++)
    {
        sumf=sumf+nums[i];          
    }
    return sumt-sumf;
}

优化内存后的代码如下

int missingNumber(int* nums, int numsSize){
    int sum=0;
    for(int i=0;i<numsSize;i++)
    {
        sum=sum+nums[i];          
    }
    return numsSize*(numsSize+1)/2-sum;
}

还可以用异或的运算法则
a ^ b ^ b = a
a ^ b ^ a = b
a ^ a = 0
a ^ 0 = a
可以得,遍历一遍 结果=结果 ^ 每项 ^ i

var missingNumber = function(nums) {
    var a =0 ;//因为数组少了一项,所以将结果初始值设为0,i从1开始遍历到n
    for(var i =1;i<=nums.length;i++){ //
        a = a ^ nums[i-1] ^ i
    }
    return a;
};

异或运算法则:
  1. a ^ b = b ^ a
  2. a ^ b ^ c = a ^ (b ^ c) = (a ^ b) ^ c;
  3. d = a ^ b ^ c 可以推出 a = d ^ b ^ c.
  4. a ^ b ^ a = b.

©️2020 CSDN 皮肤主题: 1024 设计师:上身试试 返回首页