👦个人主页:@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 {};}
};