您的位置:首页 > 理论基础 > 数据结构算法

数据结构与算法[LeetCode]—数组中出现次数异与其他数的一个数

2013-11-13 15:00 302 查看
Single Number

Given an array of integers, every element appears twice except for one. Find that single one.

Note:

Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
解决思路:
特点:一个数字出现一次,其他的出现两次。那么异或运算的性质:任何一个数异或它自己都等于0。而本题出现一次的数恰好只有一个。那么,将数组依次从前向后进行异或,出现两次的数都抵消掉。最后剩余的数就恰好是那只出现一次的一个。

class Solution {
public:
int singleNumber(int A[], int n) {

int i,ret=0;
for(i=0;i<n;++i){
ret=ret^A[i];
}
return ret;
}
};



Single Number II

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?
解题思路:
数出现两次,我们可以用“异或”来抵消掉,出现三次异或就不行了。

但是我们还是可以利用“抵消”这个原理,逐位考虑,我们记录所有数在该位上出现1的次数,超过三次清0,如果遍历后该位还是为1,那说明要找的那个数该位就是1,否则该位就是0。

参考:

/article/8613182.html

/*
思想:逐位考虑,如果某位上1出现的次数为 3*k +1 的话,那么只出现一次
的数在该位必定为1。

注意:MASK要用unsigned,而不是int
*/

class Solution{
public:
int singleNumber(int A[],int n)
{
unsigned int ret=0;
for(int i=0;i<32;i++)
{
const unsigned int MASK=(1<<i);
int t=0;
for(int j=0;j<n;j++)
t+=(A[j]&MASK)>0?1:0;
ret|=(t%3==0)?0:MASK;
}
return ret;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐