大魔王(已黑化)

大魔王(已黑化)

LeetCode —— 137. 只出现一次的数字 II-LMLPHP
LeetCode —— 137. 只出现一次的数字 II-LMLPHP

137. 只出现一次的数字 II

下面是错误的写法,没有考虑时间和空间复杂度。

// // //复杂度不行 可能是因为递归层次太深,递归每次都会在栈开空间,最会情况就是开n次
// class Solution {
// public:
//     int singleNumber(vector<int>& nums) {
//         sort(nums.begin(), nums.end());
//         int i = 0;
//         if(nums[0] != nums[1])
//             return nums[0];
//         i += 3;
//         while(i < nums.size() - 1)
//         {   
//             if(nums[i] != nums[i + 1])
//                 return nums[i];
//             i += 3;
//         }
//         return nums.back();
//     }
// };

正确解法

//分别将这些数对应二进制位的1有几个存到整型数组p中,然后分别 % 3,是3的倍数的就没了
class Solution {
public:
    int singleNumber(vector<int>& nums) {
        size_t arr[32] = {0};
        size_t a = 1;
        int flag = 0;
        int special = 0;
        for(auto x: nums)//存1
        {
            if(x < 0)
            {
                if(x == -2147483648)//这样也不行,因为这个形参里面的类型int,最小的负数转为正数就越界了,比如char,最大 127,最小-128
                {
                    x += 1;
                    special++;
                }
                x *= -1;//负数变成补码就反了一下,不适合了。   
                flag++;

            }
            for(int i = 0; i < 32; i++)
            {

                if(((a << i) & x) != 0)
                {

                    arr[i]++;
                }
            }
        }

        int num = 0;
        int system = 31;
        for(int i = 0; i < 32; i++)
        {
            if(i == 31)
            {
                cout  << "进来了" << endl;
                arr[i] %= 3;
            }
            if(arr[i] % 3 != 0)
            {
                num += pow(2, i); 
            }
        }
        if(flag % 3 != 0)
            num *= -1;
        if(special == 1)
            num--;
        return num;

    }
};
  • 博主长期更新,博主的目标是不断提升阅读体验和内容质量,如果你喜欢博主的文章,请点个赞或者关注博主支持一波,我会更加努力的为你呈现精彩的内容。

LeetCode —— 137. 只出现一次的数字 II-LMLPHP

02-01 13:33