第十八周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:

  1. The order of the result is not important. So in the above example, [5, 3] is also correct.
  2. 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;
    }
};
原创粉丝点击