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 }

原文地址:https://www.cnblogs.com/kexinxin/p/10204945.html

时间: 2024-08-30 04:46:21

Leetcode 260.只出现一次的数字III的相关文章

260. 只出现一次的数字 III

题目: 给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次. 找出只出现一次的那两个元素. 示例 : 输入: [1,2,1,3,2,5]输出: [3,5]注意: 结果输出的顺序并不重要,对于上面的例子, [5, 3] 也是正确答案.你的算法应该具有线性时间复杂度.你能否仅使用常数空间复杂度来实现? 思路: 总体思路利用了136针对一个元素情况时的解法,针对这道题,需要做的是如何把数组中的元素分到要找的这两个不同元素所在的不同的"族"中. 代码: 1 cla

力扣第260题 只出现一次的数字 III

力扣第260题 只出现一次的数字 III 给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次. 找出只出现一次的那两个元素. 示例 : 输入: [1,2,1,3,2,5] 输出: [3,5] 注意: 结果输出的顺序并不重要,对于上面的例子, [5, 3] 也是正确答案. 你的算法应该具有线性时间复杂度.你能否仅使用常数空间复杂度来实现? class Solution { public: vector<int> singleNumber(vector<int&

LeetCode 136. 只出现一次的数字(Single Number)

题目描述 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次.找出那个只出现了一次的元素. 说明: 你的算法应该具有线性时间复杂度. 你可以不使用额外空间来实现吗? 示例 1: 输入: [2,2,1] 输出: 1 示例 2: 输入: [4,1,2,1,2] 输出: 4 解题思路 由于相同的两个数异或运算结果一定为0,所以讲数组中的数依次异或,最后所有出现两次的数异或结果为0,只剩下出现一次的数,即异或结果. 代码 1 class Solution { 2 public: 3

[LeetCode] 137. 只出现一次的数字 II

题目链接 : https://leetcode-cn.com/problems/single-number-ii/ 题目描述: 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次.找出那个只出现了一次的元素. 说明: 你的算法应该具有线性时间复杂度. 你可以不使用额外空间来实现吗? 示例: 示例 1: 输入: [2,2,3,2] 输出: 3 示例 2: 输入: [0,1,0,1,0,1,99] 输出: 99 思路: 占坑, 这道题要重点研究一下! 代码: 原文地址:htt

LeetCode 137 Single Number II(只出现一次的数字 II)(*)

翻译 给定一个整型数组,除了某个元素外其余的均出现了三次.找出这个元素. 备注: 你的算法应该是线性时间复杂度.你可以不用额外的空间来实现它吗? 原文 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 im

LeetCode 136 Single Number(只出现一次的数字)

翻译 给定一个整型数组,除了某个元素外其余元素均出现两次.找出这个只出现一次的元素. 备注: 你的算法应该是一个线性时间复杂度.你可以不用额外空间来实现它吗? 原文 Given an array of integers, every element appears twice except for one. Find that single one. Note: Your algorithm should have a linear runtime complexity. Could you i

面试题40:数组中只出现一次的数字

题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字.要求时间复杂度是O(n),空间复杂度是O(1). 题目分析 剑指Offer(纪念版)P211 ① 自己与自己异或为0 ② 0与数A异或为A ③ 异或满足交换律 代码实现 void FindNumsAppearOnce(int data[], int length, int* num1, int* num2) { if (data == NULL || length < 2) return; in

数组中只出现一次的数字(剑指offer)思维有点巧

数组中只出现一次的数字 参与人数:1144时间限制:1秒空间限制:32768K 通过比例:21.75% 最佳记录:0 ms|0K(来自  牛客563536号) 题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 题目链接:http://www.nowcoder.com/practice/e02fdb54d7524710a7d664d082bb7811?rp=2&ru=/ta/coding-interviews&qru=/ta/coding

数组中只出现一次的数字

题目 一个整型数组里除了两个数字之外,其他数字都出现了两次.请找出这两个只出现一次的数字.要求时间复杂度O(n),空间复杂度O(1) 思路 我们知道如果把题目中的两个数字换成一个的话,整个数组内的元素连续异或,最终的数便是那个出现一次的数,因为异或的性质:相同为0,不同为1,所以有任何数字异或自己都是0. 换成两个数字后,我们可以继续全局异或,得到的数必然不等于0,那么也就是说二进制中必然有一位是1,比如是第K位为1,那么按照所有元素的第K位是否为1划分成两个子区间,这样,我们在这两个子区间内按