• 136. Single Number


    136. Single Number
    Given a non-empty 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 implement it without using extra memory?

    Example 1:
    Input: [2,2,1] Output: 1

    Example 2:
    Input: [4,1,2,1,2] Output: 4

    题解

    第一种:将数据存到一个list中,相同的就remove掉

    class Solution {
        public int singleNumber(int[] nums) {
            List<Integer> no_duplicate_list = new ArrayList();
            
            for (int i : nums) {
                if (no_duplicate_list.contains(i)) {
                    no_duplicate_list.remove(new Integer(i));
                    continue;
                }
                
                no_duplicate_list.add(i);
                
            }
            
            return no_duplicate_list.get(0);
            
        }
    }
    

    复杂度分析

    时间复杂度:O(n^2)O(n 2) 。我们遍历 ext{nums}nums 花费 O(n)O(n) 的时间。我们还要在列表中遍历判断是否存在这个数字,花费 O(n)O(n) 的时间,所以总循环时间为 O(n^2)O(n 2) 。
    空间复杂度:O(n)O(n) 。我们需要一个大小为 nn 的列表保存所有的 ext{nums}nums 中元素。

    第二种:用map,还是一样,有的删除,没有的put

    class Solution {
        public int singleNumber(int[] nums) {
            Map<Integer, Integer> no_duplicate_map = new HashMap<>();
            
            for (int i : nums) {
                
                if (null == no_duplicate_map.get(i)) {
                    no_duplicate_map.put(i, 1);
                    continue;
                }
               
                no_duplicate_map.remove(i);
                
            }
            
            for (int i : nums) {
                if (no_duplicate_map.get(i) != null && no_duplicate_map.get(i) == 1) {
                    return i;
                }
                
                continue;
                
            }
            
            return 0;
            
        }
    }
    

    第三种:2∗(a+b+c)−(a+a+b+b+c)=c

    这种仅仅适用于本题目,只有最多只会出现两次,最少出现一次,且出现一次的只能有一个这种情况

    class Solution {
        public int singleNumber(int[] nums) {
           int sumOfSet = 0;
            int sumOfNums = 0;
            Set<Integer> set = new HashSet<>();
            
            for (int i : nums){
                if (!set.contains(i)) {
                    set.add(i);
                    sumOfSet += i;
                }
                
                sumOfNums += i;
            }
            
            return 2 * sumOfSet - sumOfNums;
            
        }
    }
    

    第四种:异或

    如果我们对 0 和二进制位做 XOR 运算,得到的仍然是这个二进制位
    a⊕0=a
    如果我们对相同的二进制位做 XOR 运算,返回的结果是 0
    aa=0
    XOR 满足交换律和结合律
    aba=(aa)⊕b=0⊕b=b

    天呐,这都是些什么人

    都是神仙嘛?

    怎么能想出来的。。。

    class Solution {
        public int singleNumber(int[] nums) {
           int a = 0;
            
            for (int i : nums) {
                a ^= i;
            }
            
            return a;
            
        }
    }
    
  • 相关阅读:
    权值线段树模版
    P2679 [NOIP2015 提高组] 子串
    P3747 [六省联考 2017] 相逢是问候
    P2822 [NOIP2016 提高组] 组合数问题
    P2331 [SCOI2005]最大子矩阵
    P1854 花店橱窗布置
    P5888 传球游戏
    Hard | LeetCode 42. 接雨水 | 单调栈 | 双指针
    Medium | LeetCode 621. 任务调度器 | 设计
    Medium | LeetCode 166. 分数到小数 | 数学
  • 原文地址:https://www.cnblogs.com/zhangqian27/p/12653353.html
Copyright © 2020-2023  润新知