869. 重新排序得到 2 的幂

难度中等

给定正整数 N ,我们按任何顺序(包括原始顺序)将数字重新排序,注意其前导数字不能为零。

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

示例 1:

1
2
输入:1
输出:true

示例 2:

1
2
输入:10
输出:false

示例 3:

1
2
输入:16
输出:true

示例 4:

1
2
输入:24
输出:false

又是一个常规的dfs回溯

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
class Solution {
    int flag=0;
    public boolean reorderedPowerOf2(int n) {
    
        int list[]=new int [10];
        int i=0;
        while(n>0){
            list[i]=n % 10;
            n/=10;
            i++;
        }
        System.out.println(i);
        dfs(list,0,i);
        return flag==1;

    }
    void dfs(int list[],int start,int len){
        if(start==len){
            
            int ans=0;
            for(int j=0;j<len;j++){
                if(ans==0&&list[j]==0) return;//先导0
                else if(ans==0)                 ans=list[j];
                else ans=10*ans+list[j];
                
            }
            if(isPowerOfTwo(ans)) flag=1;
            return;
            
        }

        for(int i=start;i<len;i++){
            swap(list,start,i);
            dfs(list,start+1,len);
            swap(list,i,start);
        }
        return ;

    }
    void swap(int list[],int s,int d){
        int temp=list[s];
        list[s]=list[d];
        list[d]=temp;
    }
    boolean isPowerOfTwo(int n) {
        //参考2的幂那一题
        if(n==0) return false;
        if(n==1) return true;
        while(((n>>1)<<1)==n){
            n=n>>1;
             if(n==1) return true;
        }
        return false;
    }
}