只出现一次的数字

Posted fdwzy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了只出现一次的数字相关的知识,希望对你有一定的参考价值。

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

LeetCode只出现一次的数字i/ii/iii

只出现一次的数字

只出现一次的数字

c++写算法题——只出现一次的数字

剑指Offer 数组中只出现一次的数字