LosReturn

咸鱼的不归之路

[LeetCode] 137. Single Number II && [计蒜客] 单独的数字

Problem:
给定一个数组 A,除了一个数出现一次之外,其余数都出现三次。找出出现一次的数。
如:{1, 2, 1, 2, 1, 2, 7},找出 7。
你的算法只能是线性时间的复杂度,并且不能使用额外的空间哦~

Analyze:
我们将序列转换成二进制
可以得到 01,10,01,10,01,10,111.
将其累加,对每一位对3求余。

也就是 存在如下的状态
00 ➞ 01 ➞ 10 ➞ 00 ( 11 mod 3 = 00 )

那么 让 f1 , f2 表示 状态 ,每次进行 +1 操作可得到算法

f2 = f2 xor arr_tmp & ~f1;
f1 = f1 xor arr_tmp & ~f2;


Code:

#include <iostream>

using namespace std;


int get_single_number(int * arr, int len)
{
    int lo=0,hi=0;
    for (int i = 0; i < len; ++i) {
        lo = ( lo ^ *(arr+i) ) & ~hi;
        hi = ( hi ^ *(arr+i) ) & ~lo;
    }
    return lo;
}

int main()
{
    int n,ans;
    cin >> n;
    int _data[n];
    for (int i = 0 ; i < n ; ++i) {
        cin >> _data[i];
    }
    ans = get_single_number(_data, n);
    cout << ans << endl;
    return 0;
}
阅读更多

扫码向博主提问

去开通我的Chat快问

qq_31979619

非学,无以致疑;非问,无以广识
版权声明:Evil.s https://blog.csdn.net/qq_31979619/article/details/80320830
文章标签: 2进制
个人分类: LeetCode
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

[LeetCode] 137. Single Number II && [计蒜客] 单独的数字

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭