厦门网站建设咨询,网站平台开发报价单,邯郸现代建设集团网站,为什么自己花钱做的网站竟然不是自己的 (枚举和回溯
1.先把int值转换成char数组#xff0c;之后再用回溯来枚举出全部的排列顺序#xff0c;在回溯排列过程中要防止同一个数据的重新使用#xff0c;同时要计算排列中的数字总和#xff0c;在进行判断这个数据是否是2的幂#xff0c;使用递归的方式进行#xff0…枚举和回溯
1.先把int值转换成char数组之后再用回溯来枚举出全部的排列顺序在回溯排列过程中要防止同一个数据的重新使用同时要计算排列中的数字总和在进行判断这个数据是否是2的幂使用递归的方式进行判断后将判断结果加入到li2集合中最后遍历集合li2来判断全部排列的数组是否有谁的总和是符合2的幂有返回true。
class Solution {//接收排列的集合ListCharacter li1new ArrayList();//接收全部排列是否满足2的幂的集合ListInteger li2new ArrayList();public boolean reorderedPowerOf2(int n) {//把数字转化成char的数组String stn;char[] chnew char[st.length()];for(int i0;ist.length();i){ch[i]st.charAt(i);}//用于去重用的标记nums数组中什么元素用了的标记int[] Indexnew int[st.length()];Arrays.sort(ch);//调用回溯函数huisu(ch,Index,st.length());//遍历li2来看li2中是否有符合条件的2的幂的排列for(int i0;ili2.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 sum0;for(int i0;ili1.size();i){sumsum*10li1.get(i)-0;}//将数字和值判断是否是2的幂的结果加入到li2集合li2.add(iftrue(sum));return;}//遍历全部的排列for(int i0;ileng;i){//前导数字不能为零if(li1.size()0ch[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(sum1){return 1;}if(sum%21){return 0;}return iftrue(sum/2);}
}