枚举和回溯
1.先把int值转换成char数组,之后再用回溯来枚举出全部的排列顺序,在回溯排列过程中要防止同一个数据的重新使用,同时要计算排列中的数字总和,在进行判断这个数据是否是2的幂,使用递归的方式进行,判断后将判断结果加入到li2集合中最后遍历集合li2来判断全部排列的数组是否有谁的总和是符合2的幂,有返回true。
class Solution {
//接收排列的集合
List<Character> li1=new ArrayList<>();
//接收全部排列是否满足2的幂的集合
List<Integer> li2=new ArrayList<>();
public boolean reorderedPowerOf2(int n) {
//把数字转化成char的数组
String st=""+n;
char[] ch=new char[st.length()];
for(int i=0;i<st.length();i++){
ch[i]=st.charAt(i);
}
//用于去重用的标记nums数组中什么元素用了的标记
int[] Index=new int[st.length()];
Arrays.sort(ch);
//调用回溯函数
huisu(ch,Index,st.length());
//遍历li2来看li2中是否有符合条件的2的幂的排列
for(int i=0;i<li2.size();i++){
if(li2.get(i)==1){
return true;
}
}
return false;
}
//回溯函数
public void huisu(char[] ch,int [] Index,int leng){
//终止条件
if(li1.size()==leng){
//进行排列的数字计算
int sum=0;
for(int i=0;i<li1.size();i++){
sum=sum*10+li1.get(i)-'0';
}
//将数字和值判断是否是2的幂的结果加入到li2集合
li2.add(iftrue(sum));
return;
}
//遍历全部的排列
for(int i=0;i<leng;i++){
//前导数字不能为零
if(li1.size()==0&&ch[i]=='0'){
continue;
}
//假如Index【i】没有用,就进行向下寻找全排列
if(Index[i]==0){
//同时要把Index【i】标记为已使用
Index[i]=1;
li1.add(ch[i]);
huisu(ch,Index,leng);
//回溯节点,寻找其他节点
Index[i]=0;
li1.removeLast();
}
}
}
//进行判断排列的值是否时2的幂,用递归的方式判断
public int iftrue(int sum){
if(sum==1){
return 1;
}
if(sum%2==1){
return 0;
}
return iftrue(sum/2);
}
}