Leetcode 137. 只出现一次的数字 II - 题解

Leetcode 137. 只出现一次的数字 II - 题解

137. Single Number II

在线提交:
https://leetcode.com/problems/single-number-ii/

题目描述

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。

说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

示例 1:

输入: [2,2,3,2]
输出: 3

示例 2:

输入: [0,1,0,1,0,1,99]
输出: 99

  ●  题目难度: 中等
  • 通过次数:2.1K

  • 提交次数:3.6K

  • 贡献者:LeetCode

  • 相关话题 位运算
    相似题目 只出现一次的数字 只出现一次的数字 III


分析:

如果能设计一个状态转换电路,使得一个数出现3次时能自动抵消为0,最后剩下的就是只出现1次的数。使用两个bit a和b分别来记录该位上实际的值~
Leetcode 137. 只出现一次的数字 II - 题解_第1张图片

​     0 -> 1 -> 2 -> 0
​     00 -> 01 -> 10 -> 00

​     a             b
​     0             0

​     0 -> 0   0 -> 1
​     0 -> 1   1 -> 0
​     1 -> 0   0 -> 0

变成2进制,1个1个bit地处理~

数字电路(状态机) 翻转逻辑:

b flip: !a
a flip: !b calculated
return b

已AC代码:

public class Solution
{
    public int SingleNumber(int[] nums)
    {
        int a = 0, b = 0;
        for(int i = 0;i < nums.Length;i++)
        {
            b = (b ^ nums[i]) & ~a;
            a = (a ^ nums[i]) & ~b;
        }
        return b;
    }
}

Rank:
You are here!
Your runtime beats 98.48% of csharp submissions.

相关链接:
[LeetCode] Single Number II 单独的数字之二 - Grandyang - 博客园
http://www.cnblogs.com/grandyang/p/4263927.html

转载于:https://www.cnblogs.com/enjoy233/p/10408659.html

你可能感兴趣的:(数据结构与算法,runtime)