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

    Given a non-empty array of integers, every element appears three times except for one, which appears exactly once. Find that single one.

    Note:

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

    Example 1:

    Input: [2,2,3,2]
    Output: 3
    

    Example 2:

    Input: [0,1,0,1,0,1,99]
    Output: 99
     class Solution {
        public int singleNumber(int[] nums) {
            final int W = Integer.SIZE; // 一个整数的bit数,即整数字长
            int[] count = new int[W];  // count[i]表示在在i位出现的1的次数
            for (int i = 0; i < nums.length; i++) {
                for (int j = 0; j < W; j++) {
                    count[j] += (nums[i] >> j) & 1;//位移到最后一位然后和1做&运算
                    count[j] %= 3;
                }
            }
            int result = 0;
            for (int i = 0; i < W; i++) {
                result += (count[i] << i);
            }
            return result;
        }
    };

    用int长度的数组来存放1出现的次数,无论如何出现三次的数在某位出现1的次数必定是3的倍数,所以要对3求余,最终剩下的一定是出现过一次的数。注意左右移多少位。

    以下转自 https://cloud.tencent.com/developer/article/1131946

    2、同样直接上讨论区代码,再次膜拜大神。大神使用了一种统计的方法,不过不是我等平常思维的统计每个数出现了几次,而是开了一个长度为32的数组,统计每个二进制位出现了几次,最后对3取模(如果是出现了K次就对K取模),取模完哪一位不是3的整倍数,就说明只出现了一次的那个数,在这个位上为1,最终可以求出最后的结果。以下举例说明。

    举例说明:

    c++中存储一个int型整数,都是32位的空间,我们也开32位的数组。但以下为了表示简便,我们只用最后的4位,就足够了。

    假定我们的array of integers为[1,2,2,1,1,2,4,4,5,4],写成二进制位就是:

    1:0001

    2:0010

    2:0010

    1:0001

    1:0001

    2:0010

    4:0100

    4:0100

    5:0101

    4:0100

    T:0434

    R:0101

    (T表示total,合计,每一列的和。R表示对3取模完之后的结果)

    然后对T中的数值,每一位都对3取模,可以看到:出现了3的整数倍次的,取模完结果都是0;出现了非3的整数倍次的,即只出现了一次的那个数,取模完结果都为1,说明只出现一次的那个数,在当前这个位有出现过,最后也可以求出这个值。

    不得不赞叹二进制位的神奇,可以发挥出“记录”的效果。这要是三进制位,就不能这样子处理了。二进制位为1,表示出现过,在这种“1个只出现1次,其余都出现了n次”的题目中,可以发挥出奇效。

    二刷10/18/2019

    可以直接用single number I 里面的map方法,map存的是数字和出现的次数,返回出现一次的key即可。

  • 相关阅读:
    配置IVR实现语音
    建立SIP通话
    安装FreePBX的ISO版本
    Redis在linux环境下的安装
    上传文件漏洞
    忘记密码漏洞
    常见Web安全漏洞--------CSRF
    Api接口幂等设计
    常见Web安全漏洞--------防盗链
    常见Web安全漏洞--------sql注入
  • 原文地址:https://www.cnblogs.com/wentiliangkaihua/p/10522060.html
Copyright © 2011-2022 走看看