[JavaScript] Math.log10。こちらの2つの桁数を数える関数。どちらが効率的か、という話
こちらの関数
const findNumbers = function(nums) {
let evenDigitCount = 0;
for (let num of nums) {
let digitCount = Math.floor(Math.log10(num)) + 1;
if (digitCount % 2 == 0)
evenDigitCount++;
}
return evenDigitCount;
};
と
var findNumbers = function(nums) {
let evenDigitCount = 0;
for (let num of nums) {
let length = num.toString().length;
if (length % 2 == 0)
evenDigitCount++;
}
return evenDigitCount;
};
どちらが空間複雑度と計算複雑度の観点から効率がいいか
そもそもMath.log10という関数を初めて知ったのですが
実は、
toString()はnumの桁の長さに依存するのでO(n)
が、計算複雑度的にO(n)の長さの中で処理されている
問題はその処理にメモリが与えられるので
実際には空間複雑度がtoStringだと増えるO(n)
Math.log10を使うとO(1)で処理されるので
結論、
1番目の関数
計算複雑度: O(n)
空間複雑度: O(1)
2番目の関数
計算複雑度: O(n)
空間複雑度: O(n)
よって1番目の方が効率よく処理する