869. 重新排序得到 2 的幂
题目描述
给定正整数 n
,我们按任何顺序(包括原始顺序)将数字重新排序,注意其前导数字不能为零。
如果我们可以通过上述方式得到 2 的幂,返回 true
;否则,返回 false
。
示例 1:
输入:n = 1 输出:true
示例 2:
输入:n = 10 输出:false
提示:
1 <= n <= 109
解法
方法一:枚举
我们可以在 \([1, 10^9]\) 的范围内枚举所有的 \(2\) 的幂,判断它们的数字组成是否与给定的数字相同。
定义一个函数 \(f(x)\),表示数字 \(x\) 的数字组成。我们可以将数字 \(x\) 转换为一个长度为 \(10\) 的数组,或者一个按数字大小排序的字符串。
首先,我们计算给定数字 \(n\) 的数字组成 \(\text{target} = f(n)\)。然后,我们枚举 \(i\) 从 1 开始,每次将 \(i\) 左移一位(相当于乘以 \(2\)),直到 \(i\) 超过 \(10^9\)。对于每个 \(i\),我们计算它的数字组成,并与 \(\text{target}\) 进行比较。如果相同,则返回 \(\text{true}\);如果枚举结束仍未找到相同的数字组成,则返回 \(\text{false}\)。
时间复杂度 \(O(\log^2 M)\),空间复杂度 \(O(\log M)\)。其中 \(M\) 是本题的输入范围上限 \({10}^9\)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|