位运算————缺失数字
说明;
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 };