• 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的位还有其他简单的办法,但难于理解。

  • 相关阅读:
    vue基础知识
    制作离线yum源
    mysql字符集
    confluence 容器版 搭建部署
    iptables和ipvs
    http状态码
    运维相关网站博客集合
    搭建nexus私有maven私服
    MySQL 常见错误代码说明
    nc(瑞士军刀)
  • 原文地址:https://www.cnblogs.com/yingzhongwen/p/5412248.html
Copyright © 2020-2023  润新知