这是关于一个普通双非本科大一学生的C++的学习记录贴
在此前,我学了一点点C语言还有简单的数据结构,如果有小伙伴想和我一起学习的,可以私信我交流分享学习资料
那么开启正题
今天分享的是关于vector的题目
1.只出现一次的数字3
给你一个整数数组 nums
,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。你可以按 任意顺序 返回答案。
你必须设计并实现线性时间复杂度的算法且仅使用常量额外空间来解决此问题
这个题目的解决方案其实很多,可以遍历,枚举等,但是考虑时间复杂度和空间复杂度就有点难度了,后面学习哈希表可以再尝试一下,目前最好的解决方案就是位运算处理
首先遍历整个顺序表把所有元素异或得到的就是那两个数字的异或结果,再根据这个数判断两个数是从哪一位开始不一样,根据这个来进行“分组”,分组完成后就可以用我们前面的方法来解决了
class Solution {
public:
vector<int> singleNumber(vector<int>& nums)
{
vector<int> ret;
int val = 0;
int n1 = 0,n2 = 0;
int i=0;
for(i=0;i<nums.size();i++)
{
val ^= nums[i];
}
int k = 0;
while(1)
{
if(val & (1 << k))
{
break;
}
k++;
}
for(i=0;i<nums.size();i++)
{
if(nums[i] & (1 << k))
{
n1 ^= nums[i];
}
else
{
n2 ^= nums[i];
}
}
ret.push_back(n1);
ret.push_back(n2);
return ret;
}
};
这是ac代码
新手写博客,有不对的位置希望大佬们能够指出,也谢谢大家能看到这里,让我们一起学习进步吧!!