只出现一次的数


只出现一次的数

136. 只出现一次的数字

/*
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
输入: [2,2,1]
输出: 1
示例 2:

输入: [4,1,2,1,2]
输出: 4
*/class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int ans = 0;
        for(int i = 0;i<nums.size();i++){
            ans^=nums[i];
        }
        return ans;
    }
};

面试题56 - II. 数组中数字出现的次数 II

Picture1.png

/*
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现三次。找出那个只出现了一次的元素。
*/
class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int bit[32]={0};
        int n = nums.size();
        for(int i =0;i<n;i++){
            long long  temp = 1;
            int num = nums[i];
            for(int j = 31;j>=0;j--){
                if((temp & num)!=0){
                    bit[j]++;
                }
                temp<<=1;
            }
        }
        // for(int i=0;i<32;i++){
        //     cout<<bit[i]<<" ";
        // }
        // cout<<endl;
        int ret = 0;
        long long temp = 1;
        for(int i = 31;i>=0;i--){
            if(bit[i]%3==1){
                ret^=temp;
            }
            temp<<=1;
        }
        return ret;
    }
};

260. 只出现一次的数字 III

/*
给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。
输入: [1,2,1,3,2,5]
输出: [3,5]
*/
class Solution {
public:
    vector<int> singleNumber(vector<int>& nums) {
        vector<int> ret;
        int ans = 0;
        for(int i = 0;i<nums.size();i++){
            ans^=nums[i];
        }
        int x = 0;
        while((1<<x & ans) ==0){
            x++;
        }
        cout<<x<<endl;

        int ret1 = 0;
        int ret2 = 0;
        for(int i = 0;i<nums.size();i++){
            if(nums[i] & (1<<x)){
                ret1^=nums[i];
            }
            else{
                ret2^=nums[i];
            }
        }
        ret.push_back(ret1);
        ret.push_back(ret2);

        return ret;
    }
};

文章作者: anlen123
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 anlen123 !
 上一篇
vector STL 容器 vector STL 容器
vector STL 容器简介: vector是将元素置于一个动态数组中进行管理的容器 vector可以随机存取元素,支持索引值直接存取,用[]或者at()方法 vector下尾部添加或者删除元素非常快,但在中间或头部插入或者删除元素比较耗
2020-05-07 anlen123
下一篇 
堆排序 堆排序
堆排序视频教程 ![1.png) #include<bits/stdc++.h> using namespace std; void swap(int arr[],int i,int j){ int temp = arr[i
2020-05-07 anlen123
  目录