leetcode之single number

Question:
Given an array of integers, every element appears three times except for one. Find that single one.
Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
注意:不使用额外的存储空间,线性时间复杂度

analysis:
single number的本质就是用一个数记录每个bit出现的次数!!!
假设1个数 a = 0X11 (0001 0001)出现了2次,那么bit-1 与 bit-5 都出现了两次:
首先,通过异或运算,我们可以计算一个数是出现了基数次还是偶数次,如下:

flag = 0;
flag ^= a;       // 执行完此语句后 flag ==a!!!
flag ^= a;     // 再执行一次呢,a第二次出现的时候? flag == 0 !!!

如何确定一个数是出现了1次还是3次呢?(都是奇数次哦!!!)
发散一下,既然可以用一个数来记录bit是出现了1次还是2次,那么一个bit先出现了2次,然后又出现了一次,加起来就是三次啦!
看如下代码:

#include <iostream>
using namespace std;

int solve(int A[], int len){
    int ones_flag =0 ;
    int twos_flag = 0;
    int tree_flag = 0;
    for(int i = 0; i < len ; i++)
    {
        int cur = A[i];
        // step -1 更新twos_flag
        // 注意,一定要先更新twos_flag 
        twos_flag |=  cur & ones_flag;  

        //step-2 更新 ones_flag
        ones_flag ^= cur;

        // step - 3 更新three_flag
        three_flag = twos_flag&ones_flag; //在出现了2次的基础上,又出现了1次

        // step-4 更新 ones_flag 与 twos_flag      
        // 注意 要同时更新哈 
        // 抹去出现了三次的数的bit
        ones_flag &= ~three_flag;
        twos_flag &= ~three_flag;
    }// end of for
    return ones_flag;

}
int main()
{
    int A[] = {10,10,4,10,3,4,4};
    int len = 7;
    cout<<solve(A,len);

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值