2022.6.2今天你刷题了吗?
题目:
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
分析:
给定一个数组,里面只有一个单独的元素,其他的要么没有,要么都是两个重复出现
{0}:
{0,1,2,1,2}:
大致就是上面这两种情况。
解决办法就是对数组进行排序,然后判断第一个元素和它下一个元素是否相等,如果相等,则第一个元素++两次,但这里要注意,++两次之后的数组越界问题,也就是需要判断++之后的元素它的下一个位置是否有位置。对于第一种情况只需要判断数组大小为1就可以单独处理。
解析:
1.暴力求解
class Solution {
public:
int singleNumber(vector<int>& nums) {
sort(nums.begin(), nums.end());
int res = 0;
if (nums.size() == 1)
{
return nums[0];
}
for (auto i = 0; i < nums.size() - 1;)
{
if (nums[i] == nums[i + 1])
{
i = i + 2;
//判断数组越界
if (i == nums.size() - 1)
{
res = nums[i];
break;
}
else
{
}
}
else
{
res = nums[i];
break;
}
}
return res;
}
};
2.哈希表
这里的思路是利用哈希表,把nuns的元素当作键值插入,次数当作键值对插入,最后看哪个键值对应的键值对次数=1,那么就返回该键值。
class Solution {
public:
int singleNumber(vector<int>& nums) {
unordered_map<int, int>map;
for (auto i : nums)
{
map[i]++;
}
for (auto i : nums)
{
if (map[i] == 1)
{
return i;
}
return 0;
}
}
};
3.异或计算
这里的思路利用,异或原理
a异或0=a
a异或a=0
因此,我们直接异或就行
class Solution {
public:
int singleNumber(vector<int>& nums) {
int result = 0;
for (auto i : nums)
{
result ^= i;
}
return result;
}
};