Skip to the content.

Ex56-I 数组中数字出现的次数

题目描述

一个整型数组 nums里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。

解题思路

解题步骤如下:

备注:

代码

class Solution {
 public:
  std::vector<int> singleNumbers(std::vector<int>& nums) {
    decltype(nums.size()) nums_size = nums.size();
    if (nums_size < 2) return nums;
    auto xor_res = nums[0];
    for (decltype(nums.size()) i = 1; i < nums_size; ++i) {
      xor_res ^= nums[i];
    }
    auto index_first_bit_1 = find_first_bit_1(xor_res);
    int num1 = 0, num2 = 0;
    for (decltype(nums.size()) i = 0; i < nums_size; ++i) {
      if (is_bit_1(nums[i], index_first_bit_1))
        num1 ^= nums[i];
      else
        num2 ^= nums[i];
    }
    std::vector<int> res = {num1, num2};
    return res;
  }

 private:
  int find_first_bit_1(int num) {
    int index_bit = 0;
    while ((num & 1) == 0 && index_bit < 8 * sizeof(int)) {
      num = num >> 1;
      ++index_bit;
    }
    return index_bit;
  }

  bool is_bit_1(int num, int index) {
    num = num >> index;
    return num & 1;
  }
};

结果

执行结果:通过

执行用时:36 ms, 在所有 C++ 提交中击败了92.02%的用户

内存消耗:16 MB, 在所有 C++ 提交中击败了60.21%的用户