栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

力扣刷题学习869. 重新排序得到 2 的幂(C++)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

力扣刷题学习869. 重新排序得到 2 的幂(C++)

题目描述

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

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

测试用例

示例 1:

输入:1
输出:true

示例 2:

输入:10
输出:false

示例 3:

输入:16
输出:true

提示:
1 <= N <= 10^9

解题思路

此处有个重要知识点,即:如果两个十进制数从大到小重新排序后,其结果相同,则对于它们能否排列出2的幂,答案是相同的。
由题意可知,在提示范围内,共有30个2的幂数,那么只要将给定的正整数 N 排序后与这30个数比较,如果有相同的排序,那么 N 也可以重排出2的幂数。

string countDigits(int n) {
    string cnt(10, 0);
    while (n) {
        ++cnt[n % 10];
        n /= 10;
    }
    return cnt;
}

unordered_set powerOf2Digits;

int init = []() {
    for (int n = 1; n <= 1e9; n <<= 1) {
        powerOf2Digits.insert(countDigits(n));
    }
    return 0;
}();

class Solution {
public:
    bool reorderedPowerOf2(int n) {
        return powerOf2Digits.count(countDigits(n));
    }
};
复杂度分析
  1. 时间复杂度:O(log n)O(logn)。统计 nn 的每个数字的出现次数需要 O(log n)O(logn) 的时间。
  2. 空间复杂度:O(1)O(1)。
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/352633.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号