您的位置:首页 > 其它

leetcode之single number

2016-06-12 15:09 309 查看
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);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: