您的位置:首页 > 其它

136. Single Number

2017-01-31 15:14 253 查看
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 ;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode 136 single number xor