力扣:869. 重新排序得到 2 的幂

文章描述了一个Java类Solution,通过回溯算法将整数转换为字符数组并枚举所有排列,同时检查数字之和是否为2的幂。最后判断这些排列中是否存在满足条件的2的幂次方。
摘要由CSDN通过智能技术生成

枚举和回溯

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);
    }
}

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值