zoukankan      html  css  js  c++  java
  • 位运算————缺失数字

    说明;

    0~n有n+1个数字,只给出了n个数。

    方法一:

    计算n+1项的和,也就是等差数列求和,依次减去这n个数字,剩下的就是缺失的数字。

    先求和,在一步一步求差

    1 class Solution {
    2 public:
    3     int missingNumber(vector<int>& nums) {
    4         int n = nums.size();
    5         int res = n*(n+1)/2;
    6         for(int i:nums) res-=i;
    7         return res;
    8     }
    9 };

    升级版:

    想到数组较长的时候,求和可能会产生溢出。为了解决溢出,想到可以分步求和求差,每个元素进行一次加法一次减法。这样就有效减小了可能出现的最大值。

    求和 求差同时进行。

     1 class Solution {
     2 public:
     3     int missingNumber(vector<int>& nums) {
     4         //分步求和求差
     5         int res = 0;
     6         int len=nums.size();
     7         for(int i=0;i<len;i++) res += i-nums[i];
     8         res += len;
     9         return res;
    10     }
    11 };

    异或:

    任何数字和0异或都是他本身,

    任何数字和他本身异或都是0;

    所以例如:

    0,1,2,3,4,6

    1~6的异或为: 0^1^2^3^4^5^6

    这个数组异或为:0^1^2^3^5^6

    这两个结果进行异或得到的就是缺少的数字:

     0^1^2^3^4^5^6 ^ 0^1^2^3^5^6 = 0^0^1^1^2^2^3^3^5^5^6^6^4 = 0^4 = 4

     1 class Solution {
     2 public:
     3     int missingNumber(vector<int>& nums) {
     4         //分步求和求差
     5         int len=nums.size();
     6         int res=0;
     7         for(int i=0;i<len;i++) res = (res^i^nums[i]);
     8         res^=len;
     9         return res;
    10     }
    11 };
  • 相关阅读:
    MVVM知识库总结
    C#常用类汇总
    silverlight调用MVC WebApi方法
    IE调试方法(一)<转>
    PHP中关于超链接的拼接问题
    intval()和(int)转换使用与区别
    ThinkPHP模板(一)
    修改ThinkSNS网站入口
    js中的this和apply
    Thinkphp的Volist标签
  • 原文地址:https://www.cnblogs.com/pacino12134/p/11051090.html
Copyright © 2011-2022 走看看