标签:计数 答案 leetcode gnu etc ret size == mis
这种题目给一个数组,里面有一个数字只出现过一次,其他数字都出现过k次,求这个只出现过一次的数字。
参考leetcode评论区的思路,这种题目对于任意k都有一个通用解法,这个解法分别考察二进制位的每一位,求出每一位是1还是0,最终得到答案。
比如求答案的最后一位,那么统计数组所有数字的最后一位是等于1的次数。 这个次数和一定可以被k整除或者被k除余1。
被k整除的时候:说明要求的数字这一位等于0
被k除余1的时候:说明要求的数字这一位等于1,那么就加到答案相应位置去。
leetcode137.
即上面k==3的情况
1 class Solution { 2 public: 3 int singleNumber(vector<int>& nums) 4 { 5 int res=0; 6 for(int i=0;i<32;++i) 7 { 8 int cnt=0; 9 for(int&num:nums) 10 { 11 cnt+=(num>>i)&1; 12 } 13 if(cnt%3) 14 { 15 res+=(1<<i); 16 } 17 } 18 return res; 19 } 20 };
数学法:
class Solution { public: int missingNumber(vector<int>& nums) { if(nums.empty()){return 0;} int n=nums.size(); return (n*(n+1))/2-accumulate(nums.begin(),nums.end(),0); } };
位运算:
把所有数据和0到n的数字全部异或起来,存在的那些数字都会被抵消掉,最后剩下的就是答案。
1 class Solution { 2 public: 3 int missingNumber(vector<int>& nums) { 4 int siz=nums.size(); 5 int res=siz; 6 for(int i=0;i<siz;++i) 7 { 8 res^=i; 9 res^=nums[i]; 10 } 11 return res; 12 } 13 };
标签:计数 答案 leetcode gnu etc ret size == mis
原文地址:https://www.cnblogs.com/FdWzy/p/12289341.html