返回介绍

solution / 0100-0199 / 0137.Single Number II / README_EN

发布于 2024-06-17 01:04:04 字数 8132 浏览 0 评论 0 收藏 0

137. Single Number II

中文文档

Description

Given an integer array nums where every element appears three times except for one, which appears exactly once. _Find the single element and return it_.

You must implement a solution with a linear runtime complexity and use only constant extra space.

 

Example 1:

Input: nums = [2,2,3,2]
Output: 3

Example 2:

Input: nums = [0,1,0,1,0,1,99]
Output: 99

 

Constraints:

  • 1 <= nums.length <= 3 * 104
  • -231 <= nums[i] <= 231 - 1
  • Each element in nums appears exactly three times except for one element which appears once.

Solutions

Solution 1: Bitwise Operation

We can enumerate each binary bit $i$, and for each binary bit, we calculate the sum of all numbers on that bit. If the sum of the numbers on that bit can be divided by 3, then the number that only appears once on that bit is 0, otherwise it is 1.

The time complexity is $O(n \times \log M)$, where $n$ and $M$ are the length of the array and the range of elements in the array, respectively. The space complexity is $O(1)$.

class Solution:
  def singleNumber(self, nums: List[int]) -> int:
    ans = 0
    for i in range(32):
      cnt = sum(num >> i & 1 for num in nums)
      if cnt % 3:
        if i == 31:
          ans -= 1 << i
        else:
          ans |= 1 << i
    return ans
class Solution {
  public int singleNumber(int[] nums) {
    int ans = 0;
    for (int i = 0; i < 32; i++) {
      int cnt = 0;
      for (int num : nums) {
        cnt += num >> i & 1;
      }
      cnt %= 3;
      ans |= cnt << i;
    }
    return ans;
  }
}
class Solution {
public:
  int singleNumber(vector<int>& nums) {
    int ans = 0;
    for (int i = 0; i < 32; ++i) {
      int cnt = 0;
      for (int num : nums) {
        cnt += ((num >> i) & 1);
      }
      cnt %= 3;
      ans |= cnt << i;
    }
    return ans;
  }
};
func singleNumber(nums []int) int {
  ans := int32(0)
  for i := 0; i < 32; i++ {
    cnt := int32(0)
    for _, num := range nums {
      cnt += int32(num) >> i & 1
    }
    cnt %= 3
    ans |= cnt << i
  }
  return int(ans)
}
function singleNumber(nums: number[]): number {
  let ans = 0;
  for (let i = 0; i < 32; i++) {
    const count = nums.reduce((r, v) => r + ((v >> i) & 1), 0);
    ans |= count % 3 << i;
  }
  return ans;
}
impl Solution {
  pub fn single_number(nums: Vec<i32>) -> i32 {
    let mut ans = 0;
    for i in 0..32 {
      let count = nums
        .iter()
        .map(|v| (v >> i) & 1)
        .sum::<i32>();
      ans |= count % 3 << i;
    }
    ans
  }
}
int singleNumber(int* nums, int numsSize) {
  int ans = 0;
  for (int i = 0; i < 32; i++) {
    int count = 0;
    for (int j = 0; j < numsSize; j++) {
      if (nums[j] >> i & 1) {
        count++;
      }
    }
    ans |= (uint) (count % 3) << i;
  }
  return ans;
}
class Solution {
  func singleNumber(_ nums: [Int]) -> Int {
    var a = nums.sorted()
    var n = a.count
    for i in stride(from: 0, through: n - 2, by: 3) {
      if a[i] != a[i + 1] {
        return a[i]
      }
    }
    return a[n - 1]
  }
}

Solution 2: Digital Circuit

We can use a more efficient method that uses digital circuits to simulate the above bitwise operation.

Each binary bit of an integer can only represent 2 states, 0 or 1. However, we need to represent the sum of the $i$-th bit of all integers traversed so far modulo 3. Therefore, we can use two integers $a$ and $b$ to represent it. There are three possible cases:

  1. The $i$-th bit of integer $a$ is 0 and the $i$-th bit of integer $b$ is 0, which means the modulo 3 result is 0;
  2. The $i$-th bit of integer $a$ is 0 and the $i$-th bit of integer $b$ is 1, which means the modulo 3 result is 1;
  3. The $i$-th bit of integer $a$ is 1 and the $i$-th bit of integer $b$ is 0, which means the modulo 3 result is 2.

We use integer $c$ to represent the number to be read in, and the truth table is as follows:

$a_i$$b_i$$c_i$New $a_i$New $b_i$
00000
00101
01001
01110
10010
10100

Based on the truth table, we can write the logical expression:

$$ a_i = a_i' b_i c_i + a_i b_i' c_i' $$

and:

$$ b_i = a_i' b_i' c_i + a_i' b_i c_i' = a_i' (b_i \oplus c_i) $$

The final result is $b$, because when the binary bit of $b$ is 1, it means that the number appears only once.

The time complexity is $O(n)$, where $n$ is the length of the array. The space complexity is $O(1)$.

class Solution:
  def singleNumber(self, nums: List[int]) -> int:
    a = b = 0
    for c in nums:
      aa = (~a & b & c) | (a & ~b & ~c)
      bb = ~a & (b ^ c)
      a, b = aa, bb
    return b
class Solution {
  public int singleNumber(int[] nums) {
    int a = 0, b = 0;
    for (int c : nums) {
      int aa = (~a & b & c) | (a & ~b & ~c);
      int bb = ~a & (b ^ c);
      a = aa;
      b = bb;
    }
    return b;
  }
}
class Solution {
public:
  int singleNumber(vector<int>& nums) {
    int a = 0, b = 0;
    for (int c : nums) {
      int aa = (~a & b & c) | (a & ~b & ~c);
      int bb = ~a & (b ^ c);
      a = aa;
      b = bb;
    }
    return b;
  }
};
func singleNumber(nums []int) int {
  a, b := 0, 0
  for _, c := range nums {
    aa := (^a & b & c) | (a & ^b & ^c)
    bb := ^a & (b ^ c)
    a, b = aa, bb
  }
  return b
}
function singleNumber(nums: number[]): number {
  let a = 0;
  let b = 0;
  for (const c of nums) {
    const aa = (~a & b & c) | (a & ~b & ~c);
    const bb = ~a & (b ^ c);
    a = aa;
    b = bb;
  }
  return b;
}
impl Solution {
  pub fn single_number(nums: Vec<i32>) -> i32 {
    let mut a = 0;
    let mut b = 0;

    for c in nums {
      let aa = (!a & b & c) | (a & !b & !c);
      let bb = !a & (b ^ c);
      a = aa;
      b = bb;
    }

    return b;
  }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文