【位运算专题】剑指 Offer 56 – II. 数组中数字出现的次数 II

本问题对应课程链接:剑指offer刷题第四期

要求:

1、请打卡你的解题代码,如果能简单说一下思路则简单说一下思路。
2、给出你代码所用的时间复杂度和空间复杂度

共以下 16 个回答

  • June 普通 2023年9月5日 下午10:42
    class Solution {
        public int singleNumber(int[] nums) {
            int one = 0 ,two = 0;
            for (int i=0 ; i < nums.length ; i++) 
            {
                //更新第一位
                // if (two == 0)
                //     one = one ^ n;
                // if (two == 1)
                //     one = 0;
                one = ( one ^ nums[i] ) & ~two;
                //更新第二位
                // if (one == 0)
                //     two ^= n;
                // if (one == 1)
                //     two = 0;
                two = ( two ^ nums[i] )& ~one;
    
            }
            return one;
        }
    }
    
    0 赞同 0 条回复
  • hi 普通 2023年8月18日 下午8:01
    1. 状态机,循环数组中每个数时位运算一次操作32位
    class Solution {
    public:
        int singleNumber(vector<int>& nums) {
            int one = 0, two = 0;
            for(int x : nums){
                one = one ^ x & ~two;
                two = two ^ x & ~one;
            }
            return one;
        }
    };
    
    0 赞同 0 条回复
  • 艺 普通 2023年8月4日 下午4:01

    “`c++代码
    class Solution {
    public:
    int singleNumber(vector& nums) {
    int n = nums.size();
    sort(nums.begin(),nums.end());
    for(int i=0;i

    0 赞同 0 条回复
  • CaCO3 永久会员 2023年8月3日 上午8:51

    ”’java
    class Solution {
    public int singleNumber(int[] nums) {
    int[] counts = new int[32];
    for(int num : nums){
    for(int j = 0;j < 32;j++){
    counts[j]+=num&1;
    num>>>=1;
    }
    }
    int res = 0,m = 3;
    for(int i = 0;i < 32;i++){
    res <<= 1;
    res |= counts[31 – i] % m;
    }
    return res;
    }
    }
    ”’
    时间复杂度O(N)
    空间复杂度O(1)

    0 赞同 0 条回复
  •  普通 2023年8月2日 下午10:34

    c++ 代码
    class Solution {
    public:
    int singleNumber(vector& nums)
    {
    sort(nums.begin(),nums.end());
    for(int i=0;i<nums.size()-2;i+=3)
    if(nums[i]!=nums[i+2]) return nums[i];
    return nums.back();
    }
    };
    位运算
    class Solution {
    public:
    int singleNumber(vector
    & nums)
    {
    int count[32]={0},s=0;
    for(int i=0;i<nums.size();i++)
    {
    for(int j=0;j<32;j++)
    {
    count[j]+=nums[i]&1;
    nums[i]>>=1;
    }
    }
    for(int j=0;j<32;j++)
    {
    if(count[j]%3)
    s+=pow(2,j);
    }
    return s;
    }
    };
    有限自状态机
    class Solution {
    public:
    int singleNumber(vector
    & nums)
    {
    int o=0.,t=0;
    for(int i=0;i<nums.size();i++)
    o=o^nums[i]&~t,t=t^nums[i]&~o;
    return o;
    }
    };

    0 赞同 0 条回复
  • 北辰 普通 2023年8月1日 下午4:20
    class Solution {
        public int singleNumber(int[] nums) {
          int[] res = new int[32];
            int n = nums.length;
            int m = 1;
            int sum = 0;
            for(int i=0;i<32;i++) {
                for(int j=0;j<n;j++) {
                    if((nums[j]&m)!=0) {
                        res[i]++;
                    }
                }
                res[i] = res[i]%3;
                sum = sum+res[i]*m;
                m = m<<1;
            }
            return sum;
        }
    }
    

    时间复杂度:O(n)
    空间复杂度:O(1)

    0 赞同 0 条回复
  • 今天你刷题了嘛 普通 2023年7月30日 下午8:11
    class Solution {
        public int singleNumber(int[] nums) {
            // 统计每一位1的个数,再%3
            // 结果为0,则x那位为0,结果为1,则那位结果为1
            int[] count = new int[32];
            int x = 0;
            int m=1;
            for(int i=0;i<32;i++){
                for(int j=0;j<nums.length;j++){
                    if((m&nums[j])!=0) count[i]++;
                }
                count[i] %=3;
                // m = 2^i
                if(count[i]!=0) x += m;
                m<<=1;
            }
            return x;
        }
    }
    

    时间复杂度:O(n)
    空间复杂度:O(1)

    0 赞同 0 条回复
  • Mby 普通 2023年7月29日 下午10:16
    class Solution {
        public int singleNumber(int[] nums) {
            int [] res = new int[32];
            int m = 1;
            int sum = 0;
            for(int i = 0; i < 32; i++){
                for(int j = 0; j < nums.length; j++){
                    if((nums[j] & m)!= 0){
                    res[i]++;
                    }
                }
                 res[i] = res[i] % 3;
                sum = sum + res[i] * m;
                 m = m << 1;
    
            }
           return sum;
           //时间复杂度: O(n)
           //空间复杂度: O(1)
        }
    
    }
    
    
    0 赞同 0 条回复
  • 长河呼叫黄江 普通 2023年7月26日 下午11:46

    7.25
    Day17:下面是代码

    class Solution {
        public int singleNumber(int[] nums) {
            int ones = 0, twos = 0;
            for(int num : nums){
                ones = ones ^ num & ~twos;
                twos = twos ^ num & ~ones;
            }
            return ones;
        }
    }
    
    
    0 赞同 0 条回复
  • 土豆芋泥包_ 普通 2023年7月26日 下午9:30

    代码

    class Solution {
        public int singleNumber(int[] nums) {
            HashSet<Integer> set = new HashSet<>();
            long sumnum = 0;
            long sumset = 0;
            for(int x:nums){
                sumnum += x;
                if(set.contains(x)){
                    continue;
                }
                sumset += x;
                set.add(x);
            }
            return (int)((3*sumset-sumnum)/2);
        }
    }
    
    0 赞同 0 条回复
  • Marshan 普通 2023年7月26日 下午7:35

    没接触过根本想不到啊,主要是异或操作,另外找到第一个不同位置然后将数组分成两组的操作也很巧妙。

    class Solution {
    public:
        vector singleNumbers(vector& nums) {
            int z = 0;
            for(int i = 0;i < nums.size();++i){
                z ^= nums[i];
            }
            int m = 1;
            while((m & z) == 0){
                m = m << 1;
            }
            int x = 0,y = 0;
            for(int i = 0;i < nums.size();++i){
                if((nums[i] & m) == 0){
                    x ^= nums[i];
                }
                else{
                    y ^= nums[i];
                }
            }
            return vector{x,y};
        }
    };
    
    0 赞同 0 条回复
  • CKX 普通 2023年7月26日 下午5:21
    func singleNumber(nums []int) int {
        res := 0
        for i := 0; i < 32; i++ {
            //每一位
            bit := 0
            //对每一位求和
            for _, v := range nums {
                bit +=((v >> i) & 1)
            }
            //对3取余
            res += ((bit%3) << i)
        }
        return res
    }
    
    0 赞同 0 条回复
  • Luminous 普通 2023年7月25日 下午11:25
    class Solution {
        public int singleNumber(int[] nums) {
            int []res=new int[32];
            int m=1;
            int sum=0;
            for(int i=0;i<32;i++){
                for(int j=0;j<nums.length;j++){
                    if((nums[j]&m)!=0){
                        res[i]++;
                    }
                }
                res[i]=res[i]%3;
                sum=sum+res[i]*m;
                m=m<<1;
            }
            return sum;
        }
    }
    

    以上是代码

    0 赞同 0 条回复
  • #00456B 普通 2023年7月25日 下午9:19
    class Solution {
    public:
        // int singleNumber(vector<int>& nums) {
        //     //  3 010  7 0111
        //     //  3 010  7 0111
        //     //  3 010  7 0111
        //     //  4 100  9 1000
        //     //         9 1000
        //     //         9 1000
        //     //         1 0001
        //     //%3  100    0001
        //     //统计每一位上的1的个数
    
        //     vector<int> vec(32,0);
        //     int ans = 0;
        //     unsigned int m = 1;
        //     for(int i = 0; i < 32; i++){
        //         for(int x : nums){
        //             if((x & m) != 0){//如果这个位置上有1
        //                 vec[i]++;
        //             }
        //         }
        //         vec[i] %= 3;
        //         ans += vec[i]*m;
        //         m <<= 1;
        //     }
        //     return ans;
        // }
        int singleNumber(vector<int>& nums) {
            //优化循环次数    
            int temp = nums[0];
            for(auto x:nums){
                temp = max(x,temp);
            }
            int k = 0;//最高位数
            while(temp){
                temp /= 2;
                k++;
            }
    
            int ans = 0;
            unsigned int m = 1;
            for(int i = 0; i <= k; i++){
                int count = 0;
                for(int x : nums){
                    if((x & m) != 0){//如果这个位置上有1
                        count++;
                    }
                }
                count %= 3;
                ans += count*m;
                m <<= 1;
            }
            return ans;
        }
    };
    
    0 赞同 0 条回复
  • AD钙奶 普通 2023年7月25日 下午5:16

    统计所有数字在各二进制位上1的个数,并对3取余,最终结果即为数组中出现次数为1的数

    class Solution {
        public int singleNumber(int[] nums) {
            int[] res = new int[32];
            int m = 1, sum = 0;
            for(int i = 0; i < 32; i ++) {
                for(int j = 0; j < nums.length; j ++) {
                    if((nums[j] & m) != 0) {
                        res[i] ++;
                    }
                }
                res[i] %= 3;
                sum += res[i] * m;
                m <<= 1;
            }
            return sum;
        }
    }
    
    0 赞同 0 条回复
  • 阿尚 普通 2023年7月25日 下午3:26
    class Solution {
        public int singleNumber(int[] nums) {
            int res = 0;
    
            for(int i = 0; i < 32; i++){
    
                int count = 0;
    
                for(int num : nums){
                    count += ((num >> i) & 1);//统计第 i 位 1 的个数
                }
    
                res += ((count % 3) << i);//当前位1的个数对3取余即为当前位置的值
            }
    
            return res;
        }
    }
    
    0 赞同 0 条回复

# 回答此问题

后才能回答