最近刷LeetCode题目的一些思路,题目信息
从正整数 N
开始,我们按任何顺序(包括原始顺序)将数字重新排序,注意其前导数字不能为零。
如果我们可以通过上述方式得到 2 的幂,返回 true
;否则,返回 false
。
示例 1:
输入:1
输出:true
示例 2:
输入:10
输出:false
示例 3:
输入:16
输出:true
示例 4:
输入:24
输出:false
示例 5:
输入:46
输出:true
提示:
1 <= N <= 10^9
--------------------------------------------------------------------------------------
题目思路很清晰,分两步,先找到当前正整数的变种,然后对所有变种进行 2 的幂判断
1. 找到对应变种
public static boolean permutation(char[] s,int from,int to) {
if(from == to) {
if(s[0] == 0){
return false;
}else {
return realDo(Integer.valueOf(new String(s)));
}
} else {
for(int i=from; i<=to; i++) {
swap(s,i,from); //交换前缀,使其产生下一个前缀
if(permutation(s, from+1, to)){
return true;
}
swap(s,from,i); //将前缀换回,继续做上一个前缀的排列
}
}
return false;
}
public static void swap(char[] s,int i,int j) {
char tmp = s[i];
s[i] = s[j];
s[j] = tmp;
}
2. 对每一个变种进行2的幂判断
public static boolean reorderedPowerOf2(int N) {
boolean retBoolean =false;
if(N <= 10){
return realDo(N);
}
char[] dataArray = (N + "").toCharArray();
if(permutation(dataArray,0,dataArray.length-1)){
return true;
}
return retBoolean;
}
private static boolean realDo(int N){
int data = 33554432;
if(N > data){
if(N%data == 0){
N /= data;
} else{
return false;
}
}
while (N%2 == 0){
N /=2;
}
if(N == 1){
return true;
} else {
return false;
}
}
由于数据比较大的时候,可能变种有很多,所以会在每次得到变种的情况下进行直接2的幂判断,如果满足要求,则直接返回,不再进行后续判断,否则继续判断