👦个人主页:@Weraphael
✍🏻作者简介:目前学习C++和算法
✈️专栏:C++航路
🐋 希望大家多多支持,咱一起进步!😁
如果文章对你有帮助的话
欢迎 评论💬 点赞👍🏻 收藏 📂 加关注✨
目录
- 一、只出现一次的数字
- 二、删除有序数组中的重复项
- 三、只出现一次的数字 III
- 四、数组中出现次数超过一半的数字
一、只出现一次的数字
题目链接:点击跳转
思路:
-
相同的两个数异或
^
结果为0
,0 ^ 任何数 = 任何数
。 -
将所有数据进行异或,最后剩下的就是只出现一次的数。
class Solution {
public:
int singleNumber(vector<int>& nums)
{
int val = 0;
for (auto x : nums)
{
val ^= x;
}
return val;
}
};
二、删除有序数组中的重复项
题目链接:点击跳转
class Solution {
public:
// 思路:相邻两个元素之间比较即可
int removeDuplicates(vector<int>& nums)
{
vector<int>::iterator it = nums.begin() + 1;
while (it != nums.end())
{
if (*(it - 1) == *it)
{
// 删除后it会自动指向删除元素的下一个元素
// 因此不需要++
it = nums.erase(it);
}
else
{
++it;
}
}
return nums.size();
}
};
三、只出现一次的数字 III
题目链接
- 法一:哈希表
class Solution {
public:
// 法一:哈希表
vector<int> singleNumber(vector<int>& nums)
{
unordered_map<int, int> heap;
for (auto e : nums)
{
heap[e]++;
}
vector<int> ans;
for (auto e : nums)
{
if (heap[e] == 1)
{
ans.push_back(e);
}
}
return ans;
}
};
- 法二:位运算
^
详细请看这篇文章:点击跳转
四、数组中出现次数超过一半的数字
题目链接:点击跳转
#include <climits>
class Solution {
public:
// 思路:哈希表
int MoreThanHalfNum_Solution(vector<int>& numbers)
{
unordered_map<int, int> heap;
for (auto e : numbers)
{
heap[e]++;
}
for (auto e : numbers)
{
if (heap[e] > numbers.size() / 2)
{
return e;
}
}
return {};
}
};