zoukankan      html  css  js  c++  java
  • LeetCode: Single Number III

    这题的关键在于如何分开两个数。所有数的异或,这个数中位数位为1就是两个数的分叉点,对于其他数来说,在这个位上要么是0,要么是1,两次异或后都是0.具体代码如下 

     1 public class Solution {
     2     public int[] singleNumber(int[] nums) {
     3         int twoNum = 0;
     4         for (int i = 0; i < nums.length; i++)
     5         {
     6             twoNum = twoNum ^ nums[i];
     7         }
     8         int shift = 0;
     9         while ((twoNum & 1) == 0)
    10         {
    11             twoNum >>= 1;
    12             shift++;
    13         }
    14         twoNum = 1 << shift;
    15         int[] ans = new int[2];
    16         for (int i = 0; i < nums.length; i++)
    17         {
    18             if ((twoNum & nums[i]) != 0)
    19             {
    20                 ans[0] = ans[0] ^ nums[i];
    21             }
    22             else
    23             {
    24                 ans[1] = ans[1] ^ nums[i];
    25             }
    26         }
    27         return ans;
    28     }
    29 }

    取得一个数上的位数为1的位还有其他简单的办法,但难于理解。

  • 相关阅读:
    JavaScript基础
    Dao的扩展
    错题解析
    实现windows程序的数据绑定
    C#第三章
    第二章
    初始windows程序
    使用ADO.NET查询和操作数据
    使用ADO.NET访问数据库
    4.计算机层次与编程语言
  • 原文地址:https://www.cnblogs.com/yingzhongwen/p/5412248.html
Copyright © 2011-2022 走看看