第十八周leetcode题
来源:互联网 发布:淘宝卖家怎么激活 编辑:程序博客网 时间:2024/06/03 05:08
Description:
Given an array of numbers nums
, in which exactly two elements appear only once and all the other elements appear exactly twice. Find the two elements that appear only once.
For example:
Given nums = [1, 2, 1, 3, 2, 5]
, return [3, 5]
.
Note:
- The order of the result is not important. So in the above example,
[5, 3]
is also correct. - Your algorithm should run in linear runtime complexity. Could you implement it using only constant space complexity?
题目会给定一个数列,数列中有且仅有两个元素只会出现一次,其他元素(如果有的话)只会出现两次。暴力搜的话不用想肯定超时,因此考虑别的方法。因为可以看成是大量出现两次的数字中找出出现一次的数字,用数字自己异或自己等于0的特点的话可以比较轻松地找出那两个只出现一次的数字。创建两个vector a,b。 a是过渡向量,b是结果向量,再初始化一个用于异或的int类型re。将题目给定的数列从小到大排序后,依次用里面的数字累积相与(re的取值为每次跟一个数相与以后的结果)。如果re不为零(即当前数与之前的结果相与不为零),检查过渡向量,如果向量不为空的话则将里面的元素复制至结果向量中,再将过渡向量中的元素删除,然后将当前数放入过渡队列,将re的值改为当前数的值。过渡向量为空的话直接将当前数放入过渡队列。re为零的话检查过渡队列,如果不为空的话则将其中的元素弹出。(因为之前已经排好序,所以如果是连续两个一样的数的话,第一个数放入过渡向量以后因为与第二个数相与结果为零,变回弹出。如果两个数不一样的话,则本来放在过渡向量中的第一个数便会移到结果向量中)。另外如果0这个数只出现一次的话就先将其放入结果向量中再进行上述步骤。代码如下:
class Solution {
public:
vector<int> singleNumber(vector<int>& nums) {
vector<int> a;
vector<int> b;
sort(nums.begin(),nums.end());
int re=0;
int temp;
if(nums.size()==2)return nums;
else
{
if(nums[0]==0&&nums[1]!=0)b.push_back(0);
for(int i=0;i<nums.size();i++)
{
re^=nums[i];
if(re!=0)
{
if(!a.empty())
{
temp=a[0];
a.pop_back();
b.push_back(temp);
re=nums[i];
}
a.push_back(nums[i]);
}
else if(re==0)
{
if(!a.empty())a.pop_back();
}
}
if(re!=0)b.push_back(nums[nums.size()-1]);
}
return b;
}
};
public:
vector<int> singleNumber(vector<int>& nums) {
vector<int> a;
vector<int> b;
sort(nums.begin(),nums.end());
int re=0;
int temp;
if(nums.size()==2)return nums;
else
{
if(nums[0]==0&&nums[1]!=0)b.push_back(0);
for(int i=0;i<nums.size();i++)
{
re^=nums[i];
if(re!=0)
{
if(!a.empty())
{
temp=a[0];
a.pop_back();
b.push_back(temp);
re=nums[i];
}
a.push_back(nums[i]);
}
else if(re==0)
{
if(!a.empty())a.pop_back();
}
}
if(re!=0)b.push_back(nums[nums.size()-1]);
}
return b;
}
};
阅读全文
0 0
- 第十八周leetcode题
- leetcode-第十八周
- leetcode第十八周解题总结-贪心算法
- 第十八周
- 第十八周
- 第十八题
- 第十八周:[leetCode] 74. Search a 2D Matrix
- 第十八周:[Leetcode]74. Search a 2D Matrix
- 第十八周:[Leetcode]240. Search a 2D Matrix II
- 第十八周:[Leetcode]104. Maximum Depth of Binary Tree
- 第十八周:[Leetcode]111. Minimum Depth of Binary Tree
- 第十八周:[Leetcode]98. Validate Binary Search Tree
- leetcode:231 Power of Two-每日编程第十八题
- 第十八周总结
- 第十八周作业 1.0
- 第十八周工作总结
- 第十八周工作日志
- 第十八周 动态规划
- 第十三周 leetcode Add to List 55. Jump Game(Medium)
- Markdown编辑器使用说明
- Rust安装配置
- FFmpeg基础
- Help library 安装arcobjects for .NET异常问题
- 第十八周leetcode题
- 谷歌电子市场开发流程(6)-xutils的使用
- 自定义的加强型线程类
- docker之windows10安装
- python 延迟绑定(late binding)
- oracle数据库增删改查,序列,触发器
- IntelliJ IDEA 2017创建JavaEE项目
- SimpleDateFormat最简单的使用
- HDU3188 Just A Triangle【水题】