当前位置:   article > 正文

leetcode 136. Single Number_136. single number hashset

136. single number hashset

目录

一、问题分析

二、代码实现

1、异或

2、HashSet

3、计数排序


 

https://leetcode.com/problems/single-number/

给定一个非空整数数组,该数组除了一个元素只出现一次之外,其他元素均出现两次,找到这个只出现一次的元素。要求时间O(n),空间O(1)

 

一、问题分析

测试用例:

  1. Example 1:
  2. Input: [2,2,1]
  3. Output: 1
  4. Example 2:
  5. Input: [4,1,2,1,2]
  6. Output: 4

异或的思路:由于A ^ A = 0, 0 ^ A = A,并且同级的异或运算是可交换的( "(a^b)^a = (a^a)^b"就不是同级运算),因此除了待求元素之外,其他所有元素参与异或的结果为0,因此,可以遍历整个数组,将所有元素进行异或运算,结果就是该元素了。

 

二、代码实现

1、异或

  1. class Solution {
  2. //异或
  3. public int singleNumber1(int[] nums) {
  4. int ret = 0;
  5. for (int i=0; i<nums.length; i++) {
  6. ret ^= nums[i];
  7. }
  8. return ret;
  9. }
  10. }

2、HashSet

  1. class Solution {
  2. //Set
  3. public int singleNumber2(int[] nums) {
  4. int ret = 0;
  5. HashSet<Integer> set = new HashSet<>();
  6. for (int e : nums) {
  7. if (set.contains(e)) {
  8. ret = ret - e;
  9. set.remove(e);
  10. } else {
  11. ret = ret + e;
  12. set.add(e);
  13. }
  14. }
  15. return ret;
  16. }
  17. }

3、计数排序

分别计算所求元素每一位的数值,这样遍历完32遍之后就可以知道该元素的具体值了。由题意可知,该元素的某一位要么是由偶数个0和奇数个1组成,要么就是由奇数个0和偶数个0组成,没有其他情况。

此方式的优势在于既可以返回索引,又可以返回元素本身。如果要返回前者,那前两种方法就没办法那么容易做到了。而且,当其他元素均出现三次时异或方法就行不通了。此方法的时间复杂度为O(n)。

  1. class Solution {
  2. //计数排序
  3. public int singleNumber(int[] nums) {
  4. int ret = 0;
  5. //设有k个重复出现的元素,则count0 = 2*m + (0 or 1), count1 = 2*(k-m) + (1 or 0)
  6. int count0 = 0, count1 = 0; //记录所有元素某一个位上的0个数量、1的数量
  7. for (int i=0; i<32; i++) { //进行32遍遍历
  8. count0 = 0;
  9. count1 = 0;
  10. for (int j=0; j<nums.length; j++) { //每一遍计算所有元素某个位上0的个数、1的个数之和
  11. if ((nums[j] & (1 << i)) == 0) {
  12. count0 ++;
  13. } else {
  14. count1 ++;
  15. }
  16. }
  17. if (count0 % 2 == 0) { //有偶数个0,说明只出现一次的元素在1<<i位的值是1
  18. ret |= 1<<i;
  19. } else { //否则,说明该位的值是0
  20. //ret |= 0;
  21. }
  22. }
  23. return ret;
  24. }
  25. }

 

参考:

https://leetcode.com/problems/single-number/discuss/43238/Linear-time-with-no-extra-memory(计数排序)

https://leetcode.com/problems/single-number/discuss/43164/Java-solution-using-HashSet-instead-of-XOR(采用Set的简洁写法)

https://leetcode.com/problems/single-number/discuss/43275/My-linear-complexity-without-using-extra-memory-solution

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/493455?site
推荐阅读
相关标签
  

闽ICP备14008679号