🌈【LeetCode. 重新排序得到 2 的幂】- JavaScript =>Set+排序+递推

290 阅读2分钟

「这是我参与11月更文挑战的第6天,活动详情查看:2021最后一次更文挑战


说明:文章部分内容及图片出自网络,如有侵权请与我本人联系(主页有公众号:小攻城狮学前端)

作者:小只前端攻城狮、 主页:小只前端攻城狮的主页、 来源:掘金

GitHub:P-J27、 CSDN:PJ想做前端攻城狮

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


题目描述:

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

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

示例1 :

输入:1
输出:true

示例2 :

输入:10
输出:false

示例3 :

输入:46
输出:true
解法一:回溯+递推
  • n转成字符串后排序得到sortedStr
  • 根据sortedStr的长度找出符合2的幂的最小和最大指数
  • 每个值也转字符串并排序,跟sortedStr比较,相同即可返回true
var reorderedPowerOf2 = function(n) {
    
    var init = 1
    n = n.toString().split('').sort().join('')

    while (init < Math.pow(10, 9)) {
        if (n === init.toString().split('').sort().join('')) {
            return true
        }
        init *= 2
    }
    return false

};
解法2:Set+排序
  • 由于1 <= N <= 10^9,所以一共只有30个2的幂
  • 循环生成这30个幂的字符串,将其排序后,放入set
  • 判断输入的n的字符串,排序后有没有在set中出现过即可
const _0 = 48;
/**
 * @param {number} N
 * @return {boolean}
 */
var reorderedPowerOf2 = function (N) {
    let n = N.toString();
    let arr = new Array(10).fill(0);
    for (let i = 0; i < n.length; i++) {
        arr[n.charCodeAt(i) - _0]++;
    }
    const hash = arr.join();
    let start = 1;
    let str = '1';
    while (str.length < n.length) {
        start *= 2;
        str = start.toString();
    }
    while (str.length < n.length + 1) {
        let _arr = new Array(10).fill(0);
        for (let i = 0; i < str.length; i++) {
            _arr[str.charCodeAt(i) - _0]++;
        }
        if (_arr.join() === hash) {
            return true;
        }
        start *= 2;
        str = start.toString();
    }
    return false
};

感谢阅读,希望能对你有所帮助,文章若有错误或者侵权,可以在评论区留言或在我的主页添加公众号联系我。

写作不易,如果觉得不错,可以「点赞」+「评论」 谢谢支持❤