「这是我参与11月更文挑战的第6天,活动详情查看:2021最后一次更文挑战」
说明:文章部分内容及图片出自网络,如有侵权请与我本人联系(主页有公众号:小攻城狮学前端)
作者:小只前端攻城狮、 主页:小只前端攻城狮的主页、 来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
题目描述:
给定正整数
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
};
感谢阅读,希望能对你有所帮助,文章若有错误或者侵权,可以在评论区留言或在我的主页添加公众号联系我。
写作不易,如果觉得不错,可以「点赞」+「评论」 谢谢支持❤