leetcode136.只出现一次数字

258 阅读1分钟

问题描述

leetcode.136.只出现一次的数字

思路

如果没有题目要求的算法具有线性时间复杂度,和不能使用额外的空间实现,这道题很好解,直接暴力搜索时间复杂度为O(n^2),就可以完成。但想了很久都没有想到满足题目要求的解法,于是参考了官方的题解。官方题解

主要的思路就是运用异或运算,异或运算具有以下几条性质:

1、 交换律:a 异或 b = b 异或 a

2、两个相等的数异或结果等于0: a 异或 a = 0

3、0和任何数异或,结果是数本身: 0 异或 a = a

因为数组中出了答案数字之外,所有的数字都出现了两次,运用以上三条性质,遍历数组,将所有元素异或,最后的结果就是答案,amazing!!!

代码

int singleNumber(int* nums, int numsSize){
    if(numsSize == 1) return nums[0];
    int res = nums[0];
    for(int i = 1; i < numsSize; i++)
    {
        res = res ^ nums[i];
    }
    return res;
}

时间复杂度和空间复杂度

  • 时间复杂度O(n): 遍历一遍数组
  • 空间复杂度O(1): 没有使用额外的空间