码迷,mamicode.com
首页 > 其他好文 > 详细

只出现一次的数字

时间:2020-02-10 10:04:42      阅读:77      评论:0      收藏:0      [点我收藏+]

标签:计数   答案   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 };

268. 缺失数字:

技术图片

 

数学法:

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!