869. 重新排序得到 2 的幂

  1. 重新排序得到 2 的幂
    难度
    中等
    给定正整数 N ,我们按任何顺序(包括原始顺序)将数字重新排序,注意其前导数字不能为零。

如果我们可以通过上述方式得到 2 的幂,返回 true;否则,返回 false。

示例 1:

输入:1
输出:true
示例 2:

输入:10
输出:false
示例 3:

输入:16
输出:true
示例 4:

输入:24
输出:false

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reordered-power-of-2
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路:找到当前数字的所有的全排列,然后挨个进行测

 List<Character>list=new ArrayList<>();
   List<List<Character>>lists=new ArrayList<>();
   public boolean reorderedPowerOf2(int n) {
       //1.利用回溯算法得到所有的数字排序组合
       char[]chars=Integer.toString(n).toCharArray();
       //2.开始回溯
       dfs(chars,0,chars.length-1);
       //3.进行判断
       for(List<Character>ll:lists)
       {
           if(check(ll))
           {
               //System.out.println(ll.toString());
               return true;}
       }
       return false;
   }
   public void dfs(char[] chars,int index,int end)
   {
       if(index==end)
       {   //list.add(chars);
           for(int i=0;i<chars.length;i++)
           {
               list.add(chars[i]);
           }
           //System.out.println(list.toString());
           lists.add(new ArrayList<Character>(list));
           list.clear();
       }
       else
           for(int i=index;i<=end;i++)
           {
               swap(chars,index,i);
               dfs(chars,index+1,end);
               swap(chars,index,i);
           }
       //list.remove(list.size()-1);
   }
   public void swap(char[] chars,int i,int j)
   {
       char temp=chars[i];
       chars[i]=chars[j];
       chars[j]=temp;
   }
   public boolean check(List<Character>ll)
   {
       if(ll.get(0)=='0')
           return false;
       int sum=0;
       for(int i=0;i<ll.size();i++)
       {
           int temp=ll.get(i)-'0';
           sum=sum*10+temp;
       }
       return (sum& (sum - 1))==0;
   }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值