zoukankan      html  css  js  c++  java
  • 只出现一次的数字 [LeetCode]

    题目:

    给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

    说明:

    你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

    示例 1:

    输入: [2,2,1]
    输出: 1
    

    示例 2:

    输入: [4,1,2,1,2]
    输出: 4

    审题:除了某个元素只出现一次以外,其余每个元素均出现两次
    1、线性时间复杂度:要求我们的代码时间复杂度最高为O(n),不能有嵌套循环等。
    2、不使用额外空间:要求空间复杂度最高为O(1)。

    解题:
    方法一:(异或法)
      完美思路:根据异或运算的特点,相同的数字经过异或运算后结果为0,除了单独出现一次的数字外,其他数字都是出现两次的,那么这些数字经过异或运算后结果一定为0。而任何数字与0异或运算都是该数字本身。所以对数组所有元素进行异或运算,运算结果就是题目的答案。
      还有重要的一点就是:a ⊕ b ⊕ a = b.
    上代码:
    1 class Solution{
    2     public int singleNumber(int[] nums){
    3         int num = 0;
    4         for (int i = 0; i < nums.length; i++){
    5             num = num ^ nums[i];
    6         }  
    7         return num;
    8     }    
    9 }
    方法二:(比较法)
      
    思路:先对数组进行排序,然后对nums[i]和nums[i+1]进行比较,如相等,i += 2,继续下一组比较,知道取到不想等的一组。
      注意:首先这个数组的长度肯定是奇数(目标数字只出现一次,其他所有数字出现两次),所以如果上述步骤没有找到不相等的一组数,那么肯定是数组的最后一个数字是单独出现的。
    代码如下:
    class Solution {
        public int singleNumber(int[] nums) {
            Arrays.sort(nums);
            for (int i = 0; i < nums.length-1; i += 2){
                if (nums[i] != nums[i+1]){
                    return nums[i];
                }
            }
            return nums[nums.length-1];
        }
    }

    这种方法由于使用了Arrays.sot(int[] a)方法,时间复杂度是O(n3),不符合线性时间复杂度。

     
    
    
  • 相关阅读:
    E
    C. Connect Three(构造)
    判断矩形相交的方法
    字典树&&01字典树专题&&对字典树的理解
    J
    kmp专题
    Python 字典 popitem() 方法
    Python 字典 pop() 方法
    Python 字典(Dictionary) values()方法
    Python 字典(Dictionary) update()方法
  • 原文地址:https://www.cnblogs.com/zhlz/p/10471674.html
Copyright © 2011-2022 走看看