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

    分析

    参考https://cloud.tencent.com/developer/article/1131945

    我们想要达到的效果其实是——
                a  b
    初始状态      :   0   0
    第一次碰见某个数x:   0   x(把x记录在b中)
    第二次碰见某个数x:   x   0(把x记录在a中)
    第三次碰见某个数x:   0   0(把a和b都清空,可以处理其他数)
    还记得我们之前处理“所有元素都出现两次,只有一个特殊元素出现一次”的问题吗?其实我们那会想要达到的状态也是——
                a
    初始状态      :   0
    第一次碰见某个数x:   x(把x记录在a中)
    第二次碰见某个数x:   0(把a清空)
    然后我们刚好就找到了异或运算可以处理这个问题。
    那么这次我们同样利用异或运算,看能不能设计出一种变换的方法让a和b按照上述变换规则,进行转换。
    b=0时碰到x,就变成x;b=x时再碰到x,就变成0,这个不就是异或吗?所以我们也许可以设计b=b xor x。
    但是当b=0时再再碰到x,这时候b还是要为0,但这时候不同的是a=x,而前两种情况都是a=0。所以我们可以设计成:b=(b xor x)&~a
    同样道理,我们可以设计出:a=(a xor x)&~b
    在这种变换规则下,a和b都能按照我们设定的状态来发生转化。最后那个只出现一次的元素必定存储在b中。

     难度 中

    来源

    https://leetcode.com/problems/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

    解答

     1 package LeetCode;
     2 
     3 //位操作
     4 public class L137_SingleNumberII {
     5     /*public int singleNumber(int[] nums) {
     6         int result=0;
     7         for(int i=0;i<32;i++)//逐位对result进行设置
     8         {
     9             int sum=0;
    10             for(int j=0;j<nums.length;j++){
    11                 //如果这些数字的当前位为1,就用sum记录当前位为1的数目
    12                 //如果是1向左平移i位,求且的结果就不等于1了
    13                 sum+=(nums[j]>>i) &1;
    14             }
    15             result|=(sum%3)<<i;
    16         }
    17         return result;
    18     }*/
    19      public int singleNumber(int[] nums) {
    20         int a =0;
    21         int b =0;
    22         for(int i=0;i<nums.length;i++){
    23             b = b ^ nums[i] & ~a;
    24             a = a ^ nums[i] & ~b;
    25         }
    26         return a|b;
    27     }
    28     public static void main(String[] args){
    29         L137_SingleNumberII l137=new L137_SingleNumberII();
    30         int[] nums={0,1,0,1,0,1,99};
    31         System.out.println(l137.singleNumber(nums));
    32     }
    33 }

     

    博客园的编辑器没有CSDN的编辑器高大上啊
  • 相关阅读:
    Beginning SDL 2.0(5) 基于MFC和SDL的YuvPlayer
    Beginning SDL 2.0(6) 音频渲染及wav播放
    Beginning SDL 2.0(4) YUV加载及渲染
    Beginning SDL 2.0(3) SDL介绍及BMP渲染
    获取windows可执行文件的version信息(版本号)
    visual studio 2005提示脚本错误 /VC/VCWizards/2052/Common.js
    Beginning SDL 2.0(2) TwinklebearDev SDL 2.0 Tutorial
    Beginning SDL 2.0(1) SDL功能简介
    ffmpeg与H264编码指南
    2015-07学习总结——网络编程(TCP/IP)
  • 原文地址:https://www.cnblogs.com/flowingfog/p/9919342.html
Copyright © 2011-2022 走看看