136. Single Number

来源:互联网 发布:上海自贸区失败知乎 编辑:程序博客网 时间:2024/06/08 09:29

题目

Given an 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?

一个整型队列。里面的每个元素都会出现两次出过某一个整数。找到出现一次的那个整数。

时间复杂度:线性

不使用额外的存储空间


初始想法:

一开始的想法是遍历这个数组,找到出现一次的那个数。但是可以想到时间复杂度肯定不是常数,还需要额外申请一个存放每个数出现次数的数组。

int singleNumber(int* nums, int numsSize) {        //记录这个数组中的每个数的个数,每个数的个数初始化为0,当为1时表示这个数出现2次    int *counts=(int *)malloc(sizeof(int)*numsSize);    for(int i=0;i<numsSize;i++){counts[i]=0;}//全部初始化为0,不能写成int counts[numsSize]={1};这样会使得这个数组第一个数为1,然而后续的数为0        int i,j;    for(i=0;i<numsSize;i++)    {        if(counts[i]==1)        continue;                for(j=i+1;j<numsSize;j++)        {            if(counts[i]==1)            break;                        if(nums[i]==nums[j])            {                counts[i]=1;                counts[j]=1;            }        }    }        for(i=0;i<numsSize;i++)    {        if(counts[i]==0)        return nums[i];    }      }



然后,通过看别人的方法,学习到了一个可以满足题目要求的方法。

利用 “异或”。异或满足  交换律   和   结合律

性质   1:交换律 a ^ b = b ^ a,

                结合律 A ⊕ (B ⊕ C) = (A ⊕ B) ⊕ C

性质   2:0 ^ a = a。

于是利用交换律可以将数组假想成相同元素全部相邻,于是将所有元素依次做异或操作,相同元素异或为0,最终剩下的元素就为Single Number。时间复杂度O(n),空间复杂度O(1)

class Solution {public:    int singleNumber(int A[], int n) {                //异或        int elem = 0;        for(int i = 0; i < n ; i++) {            elem = elem ^ A[i];        }                return elem;    }};





0 0
原创粉丝点击