zoukankan      html  css  js  c++  java
  • Single Number II

    Given an array of integers, every element appears three times except for one. Find that single one.

    Note:
    Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?

    共3n+1个数, 只有一个是single, 其余的数都是三个相同的

    如 1 1 1 2 2 2 4 5 5 5 

    需要找出4

    class Solution {
    public:
        int singleNumber(int A[], int n) {
            int x[32];
            memset(x, 0, sizeof(x));
            for (int i = 0; i < n; i++) {
                for (int j = 0; j < 32; j++) {
                    x[j] += (A[i] >> j) & (1);
                    x[j] %= 3;
                }
            }
            int res = 0;
            for (int i = 0; i < 32; i++) {
                res += (x[i] << i);
            }
            return res;
        }
    };

    class Solution {
    public:
        int singleNumber(int A[], int n) {
            int ones = 0, twos = 0, xthrees = 0;
        for(int i = 0; i < n; ++i) {
            twos |= (ones & A[i]);
            ones ^= A[i];
            xthrees = ~(ones & twos);
            ones &= xthrees;
            twos &= xthrees;
        }
          return ones;   
        }
    };

    此解法是参考大神的, 确实高明, 二进制模拟三进制

    t1 = A^B 余2位, 称余位, 如果是1, mod2=1

    此题甚是巧妙

    ones 存储 mod3 = 1

    twos  存储 mod3 =2

    threes 是 mod3 = 0 

    threes求法 ones & twos 即两者都为1才是1, 即2+1

    然后取反, 目的是更新ones和twos中的数位




    class Solution {
    public:
        int singleNumber(int A[], int n) {
            // IMPORTANT: Please reset any member data you declared, as
            // the same Solution instance will be reused for each test case.
                  map <int, int> mp;
                  map <int, int>::iterator it;
                  for(int i = 0;i < n;i++){
                       it = mp.find(A[i]);
                       if(it == mp.end()){
                            mp[A[i]] = 1;
                       }
                       else
                       mp[A[i]]++;
                  }
                  for(it = mp.begin();it != mp.end();it++){
                      if((*it).second != 3)
                      return (*it).first;
                  }
         }
    };


    每天早上叫醒你的不是闹钟,而是心中的梦~
  • 相关阅读:
    文字超出省略号表示的几种方法
    Sqlserver数据库死锁
    Session丢失原因与解决方案
    CLR Profiler 性能分析工具 (转)
    微软HoloLens虚拟现实可以开发了。
    数据表分区
    SQLSERVER内核架构剖析 (转)
    理解SQL SERVER中的分区表(转)
    SQL Server Profile:使用方法和指标说明
    监视剪贴板(转)
  • 原文地址:https://www.cnblogs.com/vintion/p/4116989.html
Copyright © 2011-2022 走看看