leetcode869. 重新排序得到 2 的幂

这篇博客分析了一道LeetCode题目,探讨如何高效地判断一个整数是否能通过重新排列其数字形成2的幂。作者提出注意到全排列中数字0、1、2的数量相同,并预先计算2的幂次,然后比较数字组合。还提到了使用字符串映射和无序_map优化解决方案的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目连接:https://leetcode-cn.com/problems/reordered-power-of-2/

题目分析

如果直接顺着题目的思路,得到数字n的全排列,然后再去判断其是不是2的幂是比较复杂的。
我们应该注意到,因为数字是可以随意排列的,因此所有可以通过变换排列得到的数字都有相同个数的0、1、2,而 n ⩽ 1 e 9 n\leqslant1e9 n1e9,2的幂只有30个左右,我们可以先记录2的幂次然后再判断当前数字是不是和这些数字有相同的数字组合。

AC代码

class Int {
    static constexpr int MAXN = 10;
public:
    explicit Int(int x = 0);
    array<int, MAXN> cnt;
    friend bool operator == (const Int &lhs, const Int &rhs);
};

Int::Int(int x):cnt({0}) {
    while (x) {
        ++cnt[x % 10];
        x /= 10;
    }
}


bool operator == (const Int &lhs, const Int &rhs) {
    return lhs.cnt == rhs.cnt;
}

void init(vector<Int> &pow) {
    constexpr int MAXN = 1e9;
    int x = 1;
    while (x < MAXN) {
        pow.emplace_back(x);
        x <<= 1;
    }
}

class Solution {
public:
    bool reorderedPowerOf2(int n) {
        vector<Int> pow;
        init(pow);
        Int nn(n);
        for (auto &integer : pow) {
            if (integer == nn) return true;
        }
        return false;
    }
};

题解分析

刚开始的时候考虑要不要使用二分查找,但是觉得这样的话还得排序,还得预处理,每次运行样例的时候都得处理一遍好像意义不大。

看了一下题解,发现题解在全局进行预处理,使用了匿名函数,第一次在C++里面见到这样使用匿名函数,的确很方便。

int i = []() -> int {
    cout << "Hello world" << endl;
    return 0;
}();

并且题解将数字映射成了一个字符串,这样就可以使用unorder_map进行 O ( 1 ) O(1) O(1)查询,感觉还是很巧妙的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值