【LeetCode】字符串相加 - JavaScript的数组中unshift与push的效率对比

720 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

今天来一道常考题字符串相加,我在好几场面试中都遇到了,比如度小满好未来

415. 字符串相加

给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和并同样以字符串形式返回。
你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/ad…

题解

思路就是 字符串从后向前遍历,然后模拟加法运算就可以了

/**
 * @param {string} num1
 * @param {string} num2
 * @return {string}
 */
var addStrings = function(num1, num2) {
    let add = 0
    let i = num1.length - 1
    let j = num2.length - 1
    
    let result = []
    while(i >= 0 || j >= 0 || add !== 0){
        let x = num1[i] ? +num1[i] : 0
        let y = num2[j] ? +num2[j] : 0 
        
        let res = x + y + add
        
        // result.unshift(res % 10)
        result.push(res % 10)
        add = ~~(res / 10)
        i--
        j--
    }
    // return result.join('')
    return result.reverse().join('')
};

在这里插入图片描述

注意,这里不使用 unshift 而是使用 push + reverse 是效率的考量才这样的

在这里插入图片描述

unshift与push的效率对比

最后,我们简单测试一下JavaScript中unshiftpush的效率

let arr = [];
let start = new Date();

for (let i = 0; i < 100000; i++) {
  arr.push(i);
}

console.log(`push耗时:${new Date() - start}`);

arr = [];
start = new Date();

for (let i = 0; i < 100000; i++) {
  arr.unshift(i);
}

console.log(`unshift耗时:${new Date() - start}`);

node环境下测试

image.png

浏览器环境下测试

image.png