LeetCode 869. 重新排序得到 2 的幂

最近刷LeetCode题目的一些思路,题目信息

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

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

示例 1:

输入:1
输出:true

示例 2:

输入:10
输出:false

示例 3:

输入:16
输出:true

示例 4:

输入:24
输出:false

示例 5:

输入:46
输出:true

提示:

  1. 1 <= N <= 10^9

-------------------------------------------------------------------------------------- 

题目思路很清晰,分两步,先找到当前正整数的变种,然后对所有变种进行  2 的幂判断

1. 找到对应变种

public static boolean permutation(char[] s,int from,int to) {
    if(from == to) {
        if(s[0] == 0){
            return false;
        }else {
            return realDo(Integer.valueOf(new String(s)));
        }
    } else {
        for(int i=from; i<=to; i++) {
            swap(s,i,from); //交换前缀,使其产生下一个前缀
            if(permutation(s, from+1, to)){
                return true;
            }
            swap(s,from,i); //将前缀换回,继续做上一个前缀的排列
        }
    }
    return false;
}
public static void swap(char[] s,int i,int j) {
    char tmp = s[i];
    s[i] = s[j];
    s[j] = tmp;
}

2. 对每一个变种进行2的幂判断

public static boolean reorderedPowerOf2(int N) {
    boolean retBoolean =false;
    if(N <= 10){
        return realDo(N);
    }
    char[] dataArray = (N + "").toCharArray();
    if(permutation(dataArray,0,dataArray.length-1)){
        return true;
    }
    return retBoolean;
}

private static boolean realDo(int N){
    int data = 33554432;
    if(N > data){
        if(N%data == 0){
            N /= data;
        } else{
            return  false;
        }
    }
    while (N%2 == 0){
        N /=2;
    }
    if(N == 1){
        return true;
    } else {
        return false;
    }
}

由于数据比较大的时候,可能变种有很多,所以会在每次得到变种的情况下进行直接2的幂判断,如果满足要求,则直接返回,不再进行后续判断,否则继续判断

猜你喜欢

转载自blog.csdn.net/sundyguo/article/details/81099702