zoukankan      html  css  js  c++  java
  • LeetCode——Single Number II(找出数组中只出现一次的数2)

    问题:

    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?

     

    Single Number I 升级版,一个数组中其它数出现了3次,一个数只出现了一次,找出那个数。

    分析:

    问题I中是其它数出现了2次,一个数只出现了1次,找到出那个数,当时是使用了异或运算,轻松解决了问题。

    在问题II中题目变成了,其它数出现了3次,一个数只出现了一次,找出那个数,再简单的使用异或运算显然不能决绝这个问题,因为其它数也是出现了单数次。

    在这里,提出了一种可以解决问题的解决方案,但是不是很好,大神们用了一种更好的方法,这里在后面会贴出来,不过由于还没太理解,这里就先不做论述了,那接下来就简单的谈谈这个不是很好的方法。

    由于其它数都出现了3次,一个数只出现了一次,从bit上来考虑那就是,每个出现了3次的数在每位上都出现了3次,这里以13为例:

    1 2 3 4 5 6 7 8
    0 0 0 0 1 1 0 1

    那么3个13的话,每一位分别求和,那么一定是3的倍数,

    例如:

    位1,加了之后和为0,3的零倍;

    位5,6,8,和都为3,3的1倍。

    所以,我们可以分别求出数组中每一位所有数的和,然后对3求余就是只出现1次的数在当前位的值(0或1)。


    代码:

    public class Solution {
        public int singleNumber(int[] a) {
            int result = 0;
            for(int i=31;i>=0;i--){
                int temp = 0;
                result = result<<1;
                for(int j=0;j<a.length;j++){
                    temp += (a[j]>>i) & 1;
                }
                result |= temp%3;
            }
            return result;
        }
    }

    大神的代码:

    public class Solution {
        public int singleNumber(int[] A) {
            int ones = 0, twos = 0;
            for(int i = 0; i < A.length; i++){
            ones = (ones ^ A[i]) & ~twos;
            twos = (twos ^ A[i]) & ~ones;
            }
            return ones;
        }
    }
  • 相关阅读:
    老毛桃PE修改方法(屏蔽更改主页,屏蔽加装的绿色浏览器)
    老毛桃winpe优盘启动系统个性修改全攻略
    SQL2000和SQL2005和SQL2008同时安装问题
    基于FFmpeg的音频编码(PCM数据编码成AAC android)
    springboot + mybatis +easyUI整合案例
    spring thymeleaf 自定义标签
    速度挑战
    兼顾pc和移动端的textarea字数监控的实现方法
    CSS3+JS 实现的便签应用
    JavaScript实现碰撞检测(分离轴定理)
  • 原文地址:https://www.cnblogs.com/chrischennx/p/4024466.html
Copyright © 2011-2022 走看看