「这是我参与11月更文挑战的第 9 天,活动详情查看:2021最后一次更文挑战」
刷算法题,从来不是为了记题,而是练习把实际的问题抽象成具体的数据结构或算法模型,然后利用对应的数据结构或算法模型来进行解题。个人觉得,带着这种思维刷题,不仅能解决面试问题,也能更多的学会在日常工作中思考,如何将实际的场景抽象成相应的算法模型,从而提高代码的质量和性能
大数加法
题目来源:牛客网 - NC1 大数加法
题目描述
以字符串的形式读入两个数字,编写一个函数计算它们的和,以字符串形式返回
数据范围:len(s),len(t) ≤ 100000,字符串仅由'0'~‘9’构成
示例
示例 1
输入:"1","99"
返回值:"100"
说明:1+99=100
示例 2
输入:"114514",""
返回值:"114514"
解题
思路
这个比较简单,只要注意一下如何将字符类型转成整形(针对Go语言)(字符和数字正好差48)。其余的地方,跟通常计算两数相加是一样的
这个可以理解成是用字符串存储的,还有的是通过链表来存储数字进行求和的。链表存储可能是低位在链表的尾部,此时就不能像字符串存储一样,可以直接从低位进行计算
代码
func solve( s string , t string ) string {
sl, tl := len(s), len(t)
if sl == 0 {
return t
}
if tl == 0 {
return s
}
if sl < tl { //让s为那个最长的串
tl, sl = sl, tl
t, s = s, t
}
resStr := make([]byte, sl+1) //因为可能存在进位,所以+1
carry := 0 //进位
for i:=0; i < sl; i++ {
schInt := int(s[sl-i-1]-'0') // 减0是因为字符和数字正好差48,而“0” byte值是 48
tchInt := 0
if tl - i - 1 >= 0 {
tchInt = int(t[tl-i-1]-'0')
}
sum := schInt + tchInt +carry
carry = sum / 10
sum = sum % 10
resStr[sl-i] = byte(sum + '0')
}
if carry == 1 {
resStr[0] = '1'
return string(resStr)
}
return string(resStr[1:])
}