前端算法💯题第一题

191 阅读1分钟

前端算法💯题

第一题

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

输入:num1 = "11", num2 = "123"
输出:"134"
输入:num1 = "456", num2 = "77"
输出:"533"
输入:num1 = "0", num2 = "0"
输出:"0"
提示
 1.1 <= num1.length, num2.length <= 10000
 2.num1 和num2 都只包含数字 0-9
 3.num1 和num2 都不包含任何前导零
首先读题 ,明确题目要点。

1.两个非负整数 2.输入输出同为字符串 3.不可以内建大数库 4 不可以将输入字符串转为整数 从题目主干,我们了解不需要考虑负数情况,要求输入输出同位字符串。要处理大数情况,不能转成数字处理。

这里补充一点
什么是 js 大数

在 JavaScript 中,大数是指超出 JavaScript 原生数值范围的数值。JavaScript 使用 IEEE 754 标准的双精度浮点数表示数字,能够准确表示的整数范围为 -2^53 到 2^53 之间。当需要进行超出该范围的大数计算时,JavaScript 原生的数值类型将无法满足需求,可能会导致精度丢失或计算错误。

~~操作符

~~ 是按位取反操作符,它的作用是将操作数转换为整数,并且与使用 Math.floor() 函数相似。但是与 Math.floor() 不同的是,~~ 操作符执行的是位运算,因此更加高效。
(1) 只能对数字进行操作。如果操作数不是数字类型,~~ 会将其转换为数字,可能会产生意外结果。
(2)结果始终是整数,即使操作数是浮点数。
(3)结果范围受限于 JavaScript 的整数范围,超出范围的值将截断为 32 位带符号整数。

解题思路

笔者思路 将字符串 转成数组,右对齐,对应位相加。

列举三中将字符串转数组的方法

Array.from()
[...num1]
arr.split()
其中展开操作符`...``Array.from` 是 es6 方法
`split` 是字符串的原生方法
其中 split 性能最佳 推荐使用

测试如下

image.png 如果有感兴趣的可以研究下

右对齐 可以使用 pop ,用于删除并返回数组的最后一个元素

代码如下

/**
 * @param {string} num1
 * @param {string} num2
 * @return {string}
 */
var addStrings = function(num1, num2) {
    let num1Arr = Array.from(num1);
    let num2Arr = Array.from(num2);
    let addVal = ''; //保存进位值
    let result = '';//保存结果

    while (num1Arr.length || num2Arr.length || addVal) {
        addVal += ~~num1Arr.pop() + ~~num2Arr.pop();// ~~是 JavaScript 中的按位取反操作符,用于将操作数转换为整数。
        result = addVal % 10 + result;//计算当前位的结果,并将其添加到 result 的前面。
        addVal = ~~(addVal / 10);//
    }

    return result.length > 1 ? result.replace(/^0+/, '')//检查最终的结果 result 的长度是否大于 1,如果是,则去除开头的 0
	: result;
};

算法一道,贵在坚持!各位大佬,欢迎提出不同的观点。