首页 > 其他 > 详细

只出现一次的数字

时间:2020-02-10 09:07:27      阅读:48      评论:0      收藏:0      [点我收藏+]

这种题目给一个数组,里面有一个数字只出现过一次,其他数字都出现过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 };

 

只出现一次的数字

原文:https://www.cnblogs.com/FdWzy/p/12289341.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!