题目地址:
https://leetcode.com/problems/reordered-power-of-2/
给定一个正整数 n n n,可以将其各个位重新排列(首位不能是 0 0 0),问是否能变成 2 2 2的幂。题目保证 1 ≤ n ≤ 1 0 9 1\le n\le 10^9 1≤n≤109。
由于 2 30 > 1 0 9 2^{30}>10^9 230>109,所以 n n n要变换,只能变换成 2 0 , 2 1 , . . . , 2 29 2^0,2^1,...,2^{29} 20,21,...,229,只需要枚举这 30 30 30个数是否能由 n n n变换成即可。代码如下:
import java.util.Arrays;
public class Solution {
public boolean reorderedPowerOf2(int n) {
int[] cnt = new int[10];
while (n > 0) {
cnt[n % 10]++;
n /= 10;
}
for (int i = 0; i < 30; i++) {
if (Arrays.equals(cnt, get(1 << i))) {
return true;
}
}
return false;
}
private int[] get(int x) {
int[] res = new int[10];
while (x > 0) {
res[x % 10]++;
x /= 10;
}
return res;
}
}
时间复杂度 O ( log n ) O(\log n) O(logn),空间 O ( 1 ) O(1) O(1)。