LeetCode 重新排序得到2的幂(最精简的算法)

版权声明:本文为博主原创文章,博客地址:https://blog.csdn.net/qq_41855420,未经博主允许不得转载。 https://blog.csdn.net/qq_41855420/article/details/91353302

给定正整数 N ,我们按任何顺序(包括原始顺序)将数字重新排序,注意其前导数字不能为零。

如果我们可以通过上述方式得到 2 的幂,返回 true;否则,返回 false。

示例 1:

输入:1
输出:true

示例 2:

输入:10
输出:false

示例 3:

输入:16
输出:true

示例 4:

输入:24
输出:false

示例 5:

输入:46
输出:true

提示:

1 <= N <= 10^9

\color{blue}思路分析: 在int型是4个字节,一共32位,去掉最高符号位,所以可表示的2的【0,31】次方,我们只要进行一一判断即可。

class Solution {
public:
    bool reorderedPowerOf2(int N) {
        string nStr = to_string(N);//转化成字符串
        sort(nStr.begin(), nStr.end());//按照数字大小进行升序排序
        int nLen = nStr.size();//数字的长度
        //穷举2的i次幂
        for (int i = 0; i < 32; ++i){
            string numStr = to_string((int)pow(2, i));//转换成字符串
            if (numStr.size() > nLen){//长度超过了N,直接返回false
                return false;
            }
            sort(numStr.begin(), numStr.end());//按照数字大小进行升序排序
            if (numStr == nStr){//相等,则说明可以调换位置到达2的幂
                return true;
            }
        }
        return false;
    }
};

在这里插入图片描述
相比与评论区中的代码,这个算法可以说是非常清晰明了的了。
下面是将2的[0,31]次幂求出放到set中,以时间换空间。(蛋式感觉有点投机,坏笑/坏笑/)

class Solution {
public:
    bool reorderedPowerOf2(int N) {
    	//2的[1, 31]次方,1,2,4,8,16,32...经过数字排序后的结果
        unordered_set<string> strSet ={"1","2","4","8","16","23","46","128","256","125","0124","0248","0469","1289","13468",
                       "23678","35566","011237","122446","224588","0145678","0122579","0134449","0368888",
                       "11266777","23334455","01466788","112234778","234455668","012356789","0112344778"};
        string nStr = to_string(N);//转成字符串,然后排序
        sort(nStr.begin(), nStr.end());
        if (strSet.find(nStr) != strSet.end()){//查找是否在set中
            return true;
        }
        return false;
    }
};

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_41855420/article/details/91353302