Leetcode_Alog.136- Single Number

最近一直学linux,而且一直没有注意总结,有种不踏实的感觉,那就刷刷题,写写博沉淀沉淀吧。

Leetcode是个面向面试的类似OJ的平台,据说它的题目很简洁而且切中的知识点都是经典的数据结构和算法,快要找实习了,就当复习复习DSA吧。

Leetcode_Alog.136- Single Number_第1张图片

1.my solution

最先想到的就是hash table,只要table足够大,就能使得数组中每个数对应一个坑,起始坑里数字为0,该坑对应的数出现一次变为1,再出现一次又变为0,然后遍历找出坑里数为1对应的数即可。

下面是代码,用了bitset,感觉节约了空间,,要注意处理负数。感觉数据量不大,40000就可以ac了。

class Solution {
public:
    int singleNumber(vector& nums) {

    bitset<40000>b;

    int n=nums.size();
    for(int i=0;i!=n;++i)
    {
        int k=nums[i]%20000;
        b.flip( 19999+k );
    }

    for(int i=0;i!=40000;++i)
    {

            if(b.test(i))
                {
                    return i-19999;}
    }

    }
};
Runtime: 28 ms。

2.better solution

在discuss中看到了更好的方法,相比之下自己的方法就逊多了。

主要的思想是利用异或,对于每个int整数来说底层都有唯一的表示,两个数a,b进行a xor b 得到0 ,如果只出现一次, a xor 0 还是为a。通过这个方法可以快速找到唯一.

class Solution {
public:
    int singleNumber(vector& nums) {
        int res=0;
            
    for(int i=0;i!=nums.size();++i)
        res ^= nums[i];
        
        return res;
    }
};
Runtime:  20 ms.









你可能感兴趣的:(Algorithm)