森田賢二のleetCodeの使い方、解説、解答を毎日更新しているキャラクター

[JavaScript] Math.log10。こちらの2つの桁数を数える関数。どちらが効率的か、という話

[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番目の方が効率よく処理する