码迷,mamicode.com
首页 > 其他好文 > 详细

Single Number II (17)

时间:2014-11-14 22:44:04      阅读:231      评论:0      收藏:0      [点我收藏+]

标签:style   blog   io   color   ar   sp   for   div   on   

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

Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?

这一次数字重复出现的次数是3了,不像是 single number中的2,不能采取直接异或的办法了。难度上升了一点。其实只要这么想就行了,把所有的数直接看成二进制形式,如果一个数出现了3次,其每一个二进制位1就必须重复出现3次,而3%3=0。int数是4字节,对应32位,只要记录所有数二进制位出现的次数模三,就会得出那个特殊的数二进制位1出现的位置,这样就会得出那个特殊的数是谁。

按照上述思路写出代码:

class Solution {
public:
    int singleNumber(int A[], int n) {
        int bitnum[32]={0};
        int res=0;
        for(int i=0; i<32; i++){//外循环对应32个二进制位
            for(int j=0; j<n; j++){
                bitnum[i]+=(A[j]>>i)&1;//记录对应位置二进制位出现的次数
            }
            res|=(bitnum[i]%3)<<i;//还原特殊数第i+1个二进制位
        }
        return res;
    }
};

>> 和 << 代表右移和左移。例如:

a=a>>2;将a对应二进制数右移2位

a=a<<2;将a对应二进制数左移两位

请注意!(a>>i)&1取得的是a从右向左数第i个二进制位

扩展:

如果重复出现的数都出现了k次,那只需将上面的模3改为模k即可!

Single Number II (17)

标签:style   blog   io   color   ar   sp   for   div   on   

原文地址:http://www.cnblogs.com/zhoudayang/p/4098234.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!