136. Single Number

来源:互联网 发布:四维设计软件 编辑:程序博客网 时间:2024/06/16 21:25

  • Single Number

136. Single Number

使用排序再比较的方法,就会超时。

class Solution {public:    int singleNumber(vector<int>& nums) {        int nums_len = nums.size();        if(nums_len == 1)  return nums[0];        sort(nums.begin(), nums.end());        int i;        for(i = 0; i < nums_len; i += 2) {            if(i + 1 < nums_len && nums[i] != nums[i + 1])                return nums[i];        }        return nums[nums_len - 1];    }};

奇淫技巧:

class Solution {public:    int singleNumber(vector<int>& nums)     {        return std::accumulate(nums.begin(), nums.end(), 0, [](int x, int y) { return x^y; });    }};

这个思路就是相同元素抑或之后为0,而且疑惑操作满足交换律,最后的就是需要的东西。
对于accumulate的解释可以看:

http://en.cppreference.com/w/cpp/algorithm/accumulate
http://blog.csdn.net/guodongxiaren/article/details/50615067

正规做法:
哈希表。这里使用了额外的空间来做索引。其实可以用map来做,但是这里是为了更加了解哈希表所以这么写了。

class Solution {public:    int singleNumber(vector<int>& nums)     {        int result = 0;        int nums_len = nums.size();        int *hashkey = new int[nums_len]();        int *hashvalue = new int[nums_len]();        int *hashkey_m = new int[nums_len]();               int *hashvalue_m = new int[nums_len]();        int i;        int idx = 0;        for(i = 0; i < nums_len; i++) {            idx = nums[i] % nums_len;            if(idx < 0)  {                idx = ~(idx-1);                hashkey_m[idx]++;                hashvalue_m[idx] = nums[i];            }            else  {                hashkey[idx]++;                hashvalue[idx] = nums[i];            }        }        for(i=0; i < nums_len; i++)              if(hashkey[i] == 1)                return hashvalue[i];        for(i=0; i < nums_len; i++)             if(hashkey_m[i] == 1)                return hashvalue_m[i];        delete []hashkey; delete []hashvalue;        delete []hashkey_m; delete []hashvalue_m;        return 0 ;    }};
1 0
原创粉丝点击