枚举和回溯
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);}
}