题目描述:
给定正整数 N ,我们按任何顺序(包括原始顺序)将数字重新排序,注意其前导数字不能为零。
如果我们可以通过上述方式得到 2 的幂,返回 true;否则,返回 false。
示例 1:
输入:1
输出:true
示例 2:
输入:10
输出:false
示例 3:
输入:16
输出:true
示例 4:
输入:24
输出:false
示例 5:
输入:46
输出:true
提示:
1 <= N <= 10^9
emm,我使用的是全排列
效率有点低:
class Solution {
public boolean reorderedPowerOf2(int N) {
if((N & (N - 1)) == 0){
return true;
}
if(N / 10 == 0){
return false;
}
// set保存的是所有的索引
Set<Integer> set = new HashSet<>();
List<Integer> list = new ArrayList<>();
int tem = N;
int index = 0;
while (tem != 0) {
list.add(tem % 10);
tem /= 10;
set.add(index ++);
}
return getzuhe(0, set, list);
}
public boolean getzuhe(int sum,Set<Integer> set,List<Integer> list){
if(sum == 0 && set.size() == list.size() - 1){
return false;
}
if(set.size() == 0){
if((sum & (sum - 1)) == 0){
return true;
}else {
return false;
}
}
for (int i = 0; i < list.size(); i++) {
if(set.contains(i)){
set.remove(i);
if(getzuhe(sum * 10 + list.get(i), set, list)){
return true;
}
set.add(i);
}
}
return false;
}
}
学习一下别人的实现方法
不得不说效率真滴高,先将所有的2的幂次排序后放入到set中,然后我们将给的数字也排序然后看set中是否有。
class Solution {
private static Set<String> set;
static {
set=new HashSet<>();
set.add("1");
int num=1;
while (true)
{
num<<=1;
char[] s=Integer.toString(num).toCharArray();
if(s.length>10)break;
Arrays.sort(s);
set.add(new String(s));
}
}
public boolean reorderedPowerOf2(int N) {
char[] chars = Integer.toString(N).toCharArray();
Arrays.sort(chars);
String s = new String(chars);
return set.contains(s);
}
}