LeetCode — Single Number II 解题报告

题目如下:


题目解析:

    题目的意思:给定含n个整数的数组,其中除了1个数之外,其余的数出现3次。求这个出现1次的数字是什么?

    在Single Number这道题目的时候,我们巧妙的使用了数学运算中的异或操作,扫描一次数组就解决了问题。

    对于这道题目,我们最先想到的方法就是排序,然后从头到尾进行扫描一次就OK,算法耗费的时间为nlgn+n,不需要额外的空间。

    其次,想到的方法就是申请额外的空间,比如map等,对出现过的数字进行计数,然后扫描一次,即可找到只出现1次的数字,算法耗费的时间为nlgn+n/3,额外使用空间map。

    最后,我们可以统计整数的每一位出现1的次数多少。因为整数总共有32位bit,我们统计数组中的每一个整数在0-31位上出现1的数目。每一位1的数目对3进行求模操作,结果是0或者1.通过1出现的位置,即可恢复这个数字是什么。这种方法的时间复杂度为32n,并且需要额外的内存空间32个int。

    对于上述3种方法,需要根据实际的数组大小进行定夺,不能从表面的算法耗费时间进行决定哪一个更好。第3种方法不一定比第一种方法更快。

题目代码:

class Solution {
public:
    int singleNumber(int A[], int n) {
        int result = 0;
        int* count = new int[32];
        for(int i = 0; i < 32; ++i){
            count[i] = 0;
        }
        for(int i = 0; i < 32; ++i){
            for(int j = 0; j < n; ++j){
                if((A[j] >> i) & 1){
                    ++count[i];
                }
            }
            result |= ((count[i]%3) << i);
        }
        
        delete[] count;
        
        return result;
    }
};


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值