p69 只出现一次的数字III (leetcode260)

一:解题思路

之前做了一道单数数字的题目,是每个数字出现了2次,只有一个数字只出现1次。你要找到那个只出现1次的数字。那么这道题目是否可以采用那道题目比较高效的解法呢?之前那道题目比较高效的解法是异或。当然,这道题目可以借鉴里面的思想在里面。可以把这个两个单身数字分别放在两组里面,然后每组进行累加异或就可以得到最后的结果。Time:O(n),Space:O(1)

二:完整代码示例 (C++版和Java版)

C++98/03:

class Solution {
public:
    vector<int> singleNumber(vector<int>& nums) 
    {
        vector<int> ret;
        if (nums.size() == 0) return ret;

        int xorValue = 0, mask = 1;
        for (int i = 0; i < nums.size(); i++)
        {
            xorValue ^= nums[i];
        }
        while ((xorValue&mask) == 0) mask <<= 1;
        int x = 0, y = 0;

        for (int i = 0; i < nums.size(); i++)
        {
            if ((nums[i] & mask) == 0) x ^= nums[i];
            else y ^= nums[i];
        }
        ret.push_back(x);
        ret.push_back(y);

        return ret;
    }
};

C++11:

class Solution {
public:
    vector<int> singleNumber(vector<int>& nums) 
    {
        vector<int> ret;
        if (nums.size() == 0) return ret;
        int xorValue = 0, mask = 1;

        for (auto it : nums)
            xorValue ^= it;
        while ((xorValue&mask) == 0) mask <<= 1;
        int x = 0, y = 0;

        for (auto it : nums)
        {
            if ((it&mask) == 0)
            {
                x ^= it;
            }
            else
            {
                y ^= it;
            }
        }

        ret = {x,y};

        return ret;
    }
};

Java:

class Solution {
    public int[] singleNumber(int[] nums) 
    {
          int xorValue=0,mask=1;
          for(int num:nums)
              xorValue^=num;
          while((xorValue&mask)==0) mask<<=1;
          int x=0,y=0;
          for(int num:nums)
          {
              if((num&mask)==0)
              {
                  x^=num;
              }
              else
              {
                  y^=num;
              }
          }
          
          return new int[]{x,y};
    }
}

 

posted @ 2020-03-25 16:21  repinkply  阅读(218)  评论(0)    收藏  举报