高频算法面试题(十八)- 大数加法

271 阅读2分钟

「这是我参与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:])
}