这几天做算法做的腰酸背疼的,每张卷子连学带复习带做都是6h起步,做题同时还得不断复习原来的知识结构,由思路转换为工程能力的过程真的是异常痛苦啊,但是继续加油吧,还是教员的那一句话——坚持数年,方有成效,什么事儿都怕持之以恒。
Topic 1:大数加法
解决大数问题有一个基本要求,了解string特性以及数的位、进位操作
对于加法来说,解决思路相对简单,模拟竖式加法的过程,每位相加,保持十进制过9进位的性质即可
这示例2谁写啊,太臭了!(恼)
总体比较简单
Topic 2:链表相加
加法需要从尾部开始倒着进位处理,所以需要让其逆置,从这里用两种方法来解决这个问题,一是使用反转链表来处理,二用栈结构来处理
方法一:逆置链表
整体比较简单,主要考验链表的熟练度,很久没有复习链表,遗忘很多,部分细节仍需练习;
还要注意一个问题就是内存释放的问题,为什么结果这里只delete dummy一个节点,为什么不释放结果链表,因为dummy作为占位头节点的作用已经完成,不会再使用了,而结果链表是函数的返回值,应该由调用者负责管理其内存,调用者在使用完结果链表后,需要遍历链表并逐个释放节点。
方法二:栈模拟
我还是比较喜欢这个版本,清晰又优雅,略带一些小理解,是否也能给我们一些启示,处理需要reverse的问题,是否都能考虑使用栈的特性(Last In, First out)来实现?
Topic 3:大数乘法
同leetcode43 字符串相乘
当然这是比较基础的解法,想成为高手的话,不仅需要熟练掌握基础的使用,在此基础上我们还可以扩展使用快速傅里叶变换(FFT)来解决问题,这样的话能够使整体时间复杂度从On² 降为Onlogn,等之后有时间再来搞定进阶使用(数学真头疼呀)。