力扣刷题笔记 → 869. 重新排序得到 2 的幂

178 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

题目

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

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

示例

输入: 1
输出: true
输入: 10
输出: false
输入: 16
输出: true
输入: 24
输出: false
输入: 46
输出: true

提示

  • 1 <= N <= 10^9

解题思路

哈希预处理

在提示中有限定了数值N的范围在[1,10^9]之间,那么我们可以先做一个预处理,将该区间内所有2的幂进行拆分,统计各位数值的数量,然后保存到哈希表中。

由于题目中说明可以按照任意的顺序,那么我们可以将N拆分成[0,9]十位元素,分别统计每一位元素出现的个数,只要其个数与哈希表中已存在的数值个数相等,那么我们就可以通过排序将其排列成为2的幂。

class Solution {
    // 哈希表记录所有2的幂组合
    static Set<String> set = new HashSet<>();
    
    // 预处理,将区间[1,10^9]中数字的各位数字进行统计
    static {
        for(int i = 1; i <=1e9; i <<= 1){
            set.add(countDigits(i));
        }
    }

    // 统计每一位数字出现的个数,转换成String类型保存到哈希表中
    public static String countDigits(int i){
        char[] cnt = new char[10];
        while(i > 0){
            ++cnt[i % 10];
            i /= 10;
        }
        return new String(cnt);
    }
    
    public boolean reorderedPowerOf2(int n) {
        // 返回结果
        return set.contains(countDigits(n));
    }
}

复杂度分析

  • 时间复杂度:O(logN)O(logN)
  • 空间复杂度:O(N)O(N)

最后

文章有写的不好的地方,请大佬们不吝赐教,错误是最能让人成长的,愿我与大佬间的距离逐渐缩短!

如果觉得文章对你有帮助,请 点赞、收藏、关注、评论 一键四连支持,你的支持就是我创作最大的动力!!!

题目出处: leetcode-cn.com/problems/re…