• Leetcode 260.只出现一次的数字III


    只出现一次的数字III

    给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。

    示例 :

    输入: [1,2,1,3,2,5]

    输出: [3,5]

    注意:

    1. 结果输出的顺序并不重要,对于上面的例子, [5, 3] 也是正确答案。
    2. 你的算法应该具有线性时间复杂度。你能否仅使用常数空间复杂度来实现?

    分析

    1. 数组中所有数字做异或运算,因为有两个元素只出现一次,所以最后的异或运算结果sum 为两个单独元素x,y的异或结果。因为相同数字异或运算结果为0。

    我们要得到x,y的结果,就是要利用sum把x,y分出来。

    2. 我们把数组nums分为两组,其中x在一组,y在另一组。那么按照什么来分组呢?

    我们知道数组所有元素异或运算(也就是x,y的异或运算)sum的结果一定不为0,因为x≠y,那么x和y的二进制表示中肯定有一或多位不相等,即肯定存在x中的某一位值为 1 , y中相同位的值为 0 。我们依据x和y中某一位值不一样将数组分为两组:

    分组一包含x,也就是某特定位为1(0)的所有元素,分组二包含y,也就是某特定位为0(1)的所有元素。

    3. 那么接下来,怎样按照上述方法去判断数组中某位的值是0是1呢?

    可以用与&运算。我们引入一个flag值,flag表示的是x,y的二进制表示中,值不同的一位,将这一位取值为1,其它所有位取值为0(如果还存在其它取值不同的位,也置为0)。这里我们确定flag值的方法 : flag = sum & (~(sum - 1));

    举个例子,比如 x = 5,y = 3:

    首先转换二进制 x = 101 y = 11 ——> 异或运算 sum = x ^ y = 110 ——> flag取值 flag = 10 (010)

    4. 好找到了flag然后可以用与&运算了,x,y中肯定有一个数字同flag做与&运算时取值为0。为啥,因为flag为0的位,无论同1还是0做与运算都位0,那么flag为1的位只有一位,而这位是根据x,y不同位确定的位数,也就是说x,y同flag为1位相同的位数,一个是0,另一个是1,是0的那个数做与运算当然结果为0了。 其它数也根据是根据这个道理,进行了分组。

    5. 最后将分组一内所有的元素做异或运算,得出x,将分组二内所有元素做异或运算,得出y。为啥,因为啊分组一(二)中的数,除去x和y以外,都是相同的数字啦,相同的数字做异或,得0呀。

     1 public class Solution {
     2     public List<List<String>> printTree(TreeNode root) {
     3         int height = getHeight(root);
     4         String[][] res = new String[height][(1 << height) - 1];
     5         for(String[] arr:res)
     6             Arrays.fill(arr,"");
     7         List<List<String>> ans = new ArrayList<>();
     8         fill(res, root, 0, 0, res[0].length);
     9         for(String[] arr:res)
    10             ans.add(Arrays.asList(arr));
    11         return ans;
    12     }
    13     public void fill(String[][] res, TreeNode root, int i, int l, int r) {
    14         if (root == null)
    15             return;
    16         res[i][(l + r) / 2] = "" + root.val;
    17         fill(res, root.left, i + 1, l, (l + r) / 2);
    18         fill(res, root.right, i + 1, (l + r + 1) / 2, r);
    19     }
    20     public int getHeight(TreeNode root) {
    21         if (root == null)
    22             return 0;
    23         return 1 + Math.max(getHeight(root.left), getHeight(root.right));
    24     }
    25 }
  • 相关阅读:
    python 得到请求的返回内容
    pyhton编码解码理解
    .NET数据库编程求索之路--1.引子
    (转)C#调用C函数(DLL)传递参数问题
    C# 如何在Excel 动态生成PivotTable
    高效Web开发的10个jQuery代码片段
    关于大型网站技术演进的思考(一)--存储的瓶颈(1)
    100. Same Tree
    226. Invert Binary Tree
    169. Majority Element
  • 原文地址:https://www.cnblogs.com/kexinxin/p/10204945.html
Copyright © 2020-2023  润新知