法1:全排列模拟~
import java.util.HashMap;
import java.util.Map;
class Solution {
static Map<Integer, Boolean> mp = new HashMap<>();
static {
for (int i = 1; i <= 1000000000; i *= 2) {
mp.put(i, true);
}
}
boolean ans = false;
int len;
public boolean reorderedPowerOf2(int n) {
String num = String.valueOf(n);
len = num.length();
Integer[] cnt = new Integer[10];
for (int i = 0; i < 10; i++) {
cnt[i] = 0;
}
for (int i = 0; i < len; i++) {
cnt[num.charAt(i) - '0']++;
}
dfs(new StringBuffer(), cnt);
return ans;
}
void dfs(StringBuffer s, Integer[] cnt) {
if (ans) {
return;
}
if (s.length() == len) {
if (mp.containsKey(Integer.parseInt(s.toString()))) {
ans = true;
}
return;
}
// 头部0特判
if (s.length() != 0 && cnt[0] != 0) {
s.append('0');
cnt[0]--;
dfs(s, cnt);
cnt[0]++;
s.deleteCharAt(s.length() - 1);
}
for (int i = 1; i < 10; i++) {
if (cnt[i] != 0) {
s.append((char) (i + '0'));
cnt[i]--;
dfs(s, cnt);
cnt[i]++;
s.deleteCharAt(s.length() - 1);
}
}
}
}
法2: 用数组存储每个ans各个位数上0~9的出现次数,然后直接匹配,这里因为最多只有1e9,也就是一个数字的出现次数不会超过9个,可以使用一个string来存储。
import java.util.HashSet;
import java.util.Set;
class Solution {
static Set<String> set = new HashSet<>();
static {
for (int i = 1; i <= 1000000000; i *= 2) {
set.add(getCnt(i));
}
}
public boolean reorderedPowerOf2(int n) {
return set.contains(getCnt(n));
}
static String getCnt(int n) {
int[] cnt = new int[10];
String s = String.valueOf(n);
StringBuffer result = new StringBuffer("0000000000");
int len = s.length();
for (int i = 0; i < len; i++) {
result.setCharAt(s.charAt(i) - '0', (char) (result.charAt(s.charAt(i) - '0') + 1));
}
return result.toString();
}
}