携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第10天,点击查看活动详情
现在是22:17。差一点就 生死时速。差一点与小熊锅锅擦肩而过。赶紧赶紧写一下!!!
题目:
给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和并同样以字符串形式返回。
你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。
示例:
示例 1:
输入:num1 = "11", num2 = "123" 输出:"134"
示例 2:
输入:num1 = "456", num2 = "77" 输出:"533"
示例 3:
输入:num1 = "0", num2 = "0" 输出:"0"
大家快来看,这道题好智障,1+1=2还要用算法。
不不不,是我眼瞎,是我格局小,是我没涨见识,是我心胸狭隘。
题目要求是字符串,不可以直接相加的,也不可以转化成整数之后再相加。那算了。
小学数学就知道做加法运算时要先从个位数字加起,如果超过十就进一。那大学算法也这样做吧,返璞归真。
最后一位字符的位置分别是nums1.length-1与nums2.length-1。
如何获取到呢,利用charAt()。charAt(nums1.length-1)就是“1234”中的“4”了,
隐式转换:“4”-0=4(string转化成number类型)
代码:
var addStrings = function (num1, num2) {
let i = num1.length - 1
let j = num2.length - 1
let carry = 0 // 进位数,即留到下一轮相加的数
let res = [] // 存放相加结果的个位数
while (i >= 0 || j >= 0 || carry !== 0) {
// 将v1 , v2 转为数值,其中一个数加完 <0 后赋值对应值为0,防止出错
const v1 = i >= 0 ? num1.charAt(i) - '0' : 0
const v2 = j >= 0 ? num2.charAt(j) - '0' : 0
let val = v1 + v2 + carry
res.unshift(val % 10) // 将相加后的个位数放进数组,用unshift从头往前放,因为是从后往前相加的
carry = Math.floor(val / 10) // 相加后的十位数,留在下一次作为进位数一起进行相加
// 两个指针继续往前走
i--
j--
}
return res.join('')
};
够500字了,周五潜水一下没什么毛病吧。yep!!!周五万岁!!!!