問題インデックス(最大5):⭐
タイトル
正の整数を与えられたa
最小の正の整数を見つけるために、b
ようにb
全てを乗算することによりビット数が正確に等しいですa
。
そのような結果がない場合、または結果が32ビットの符号付き整数でない場合は、0を返します。
サンプル1
入力してください:
48
出力:
68
サンプル2
入力してください:
15
出力:
35
ヒント:
「そのような結果はありません」与えられた整数が10より大きい素因数を含む場合があります判断することを忘れないでください
解決策
最下位の桁(1桁)から始めて答えを列挙できます。小さい桁の上にできるだけ大きな桁を配置するようにしてください。
したがって、最下位ビットから列挙を開始し、aを9で除算できないまで、つまりaをa = a0 * 9 ^ tとして表すことができ、tができるだけ大きくなるまで、9を配置し続けます。次に、a0が8で割り切れなくなるまで8を入れ続け、a0が7で割り切れなくなるまで7を入れ続けます。この貪欲な方法は、基本的に深さ優先検索戦略と同じですが、最終的な回答が直接見つかるので、不要な検索を回避できます。
複雑さの分析
時間の複雑さ:O(log a)、数値を因数分解した後、最大でO(log a)数の積として表現できます。
スペースの複雑さ:O(1)。
JavaScriptの実装
/**
* @param {number} a
* @return {number}
*/
var smallestFactorization = function (a) {
result = [];
// 10以下的直接返回本身
if (a < 10) {
return a;
}
// 太大舍弃
else if (a > 2 ** 31) {
return 0;
}
let k = 9;
while (a > 1 && k > 1) {
if (a % k === 0) {
a = a / k;
result.unshift(k);
// k = 9; k不需要重置为9,因为每次都是贪心策略,大于当前k的值已经无法被a整除
continue;
}
else {
k--;
}
}
result = Number(result.join(''));
// 判断因式是否有大于10的质数
if (result > 2 ** 31 || a >= 10) return 0;
return result;
};
console.log(smallestFactorization(22));
console.log(smallestFactorization(15));
体験
最近、フロントエンドのインターンシップの仕事で、jsシステムは少し学び、そして決定的にpythonからjsになりました。jsはまだ香りがよく、すべての変換関数をすぐに利用できます。
使用される変換関数:
格納結果は、配列の先頭から1桁のシフトなし()から順に追加されます。
配列の各要素間のコンマを削除し、それを文字列結合()に変換します
文字列を数値-数値()に変換します