LeetCode — Single Number II 解题报告

来源:互联网 发布:软件质量保证大纲 编辑:程序博客网 时间:2024/05/16 14:33

题目如下:


题目解析:

    题目的意思:给定含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
原创粉丝点击