136. 只出现一次的数字

一、题目

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

说明:

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

示例 1:

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

示例 2:

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

二、题解

1. 异或

class Solution {
    public int singleNumber(int[] nums) {
    
        int result = 0;

        for (int i = 0; i < nums.length; i++) {
            result ^= nums[i];
        }

        return result;
    }
}
  • 不需要额外的空间是指的算法的空间复杂度为O(1)级别

  • 异或运算满足交换律——A ^ B ^ A= A ^ A ^ B

  • 任何数异或0都是原数——0 ^ A = A

    • result = 0;
      result ^ 2 = 2;
      
  • 两个相同的数异或为0——A ^ A = 0

    • 2 ^ 2 = 0;
      
  • 因此一个数字异或同一个数两次还是原数——A ^ B ^ C ^ B ^ C = A ^ B ^ B ^ C ^ C = A

    • result = 1;
      1 ^ 2 = 3;// 01 10
      3 ^ 2 = 1;// 11 10
      1 ^ 3 = 2;// 01 11
      2 ^ 3 = 1;// 10 11  结果还是1
      

2. 先排序后比较

class Solution {
    public int singleNumber(int[] nums) {
              
        //冒泡排序
        int temp = 0;  
        for (int i = 0; i < nums.length-1; i++){
            for (int j = 0; j < nums.length-1; j++) {
                if (nums[j]>nums[j+1]) {
                    temp = nums[j];
                    nums[j] = nums[j + 1];
                    nums[j + 1] = temp;
                }
            }
        }

        //两两比较,不一样就跳出循环输出那个数
        temp = nums[0];
        for (int i = 0; i < nums.length-2; i+=2) {
            if(temp==nums[i+1]){
                temp = nums[i+2];
            }else {
                break;
            }
        }
        return temp;
    }
}
  • 冒泡排序空间复杂度为O(1)
posted @ 2020-10-09 16:30  球球z  阅读(145)  评论(0)    收藏  举报