数据结构与算法MOOC习题解题报告(PART 1:第1课-第5课)

这篇博客是关于数算MOOC的习题解题报告,涵盖了从第1课的概论到第5课的二叉树I。涉及到的题目包括A+B Problem、约瑟夫问题、多项式加法、高精度乘法、凯撒加密法、中缀表达式转换、数字-英语翻译、周期性字符串检测、二叉树重建等。博主详细讲解了每道题目的解题思路和关键算法,如链表模拟、栈队列应用、KMP模式匹配和最小堆实现。
摘要由CSDN通过智能技术生成

数算MOOC习题解题报告(PART 1:第1课-第5课)

第1课 概论(Introduction)(共1题)

1.A+B Problem

The programming lab for the first week is quite easy. It is set for you to be accustomed to the system.

第2课 线性表(Linear Lists)(共3题)

1.Monkey king election

数组模拟链表做约瑟夫问题。

2.Addition of Polynomial

多项式加法,注意一个细节:输入数据可以出现没有合并同类项的多项式。本题本质是输入一项查找一项是否存在并处理,并不是最快的算法,最快的算法是读入所有项后排序再处理。

3.Multiplication of large interger

高精度乘法。

第3课 栈与队列(Stacks and Queues)(共3题)

1.Decoding

简单模拟凯撒加密法即可。

2.出栈序列统计

数据规模较小,直接回溯即可,事实上本题答案是卡特兰数。

3.Lazy Math Instructor

注意到数字只有一位,所以本题采用给字母赋一些大的值的随机算法准确率就很高。
另外本题是中缀表达式,转为后缀表达式才可以用栈直接计算值。中缀转后缀的算法是:
1. 数字字母直接写入后缀表达式。
2. 左括号直接入栈。
3. 右括号则把栈内最顶上一个左括号之前的符号写入后缀表达式,左括号出栈。
4. 看到算术符号则看栈,如果栈顶符号应该放在该符号之前计算一律出栈放入后缀表达式,再将算术符号入栈。
5. 最后将栈里的元素全部出栈依次放入后缀表达式。
另外值得注意的一个细节是,中缀表达式里存在空格,所以遇到空格要直接continue,魔鬼是细节,很多细节没注意到的话,题目会做就是无法AC。

第4课 字符串(Strings)(共3题)

1.English-Number Translator

本题是一个模拟题,算法注意表示数字的英语单词的语法层级即可。即先累加计算数字n1,一看到hundred就乘以100加入n2并清空n1,看到thousand或million再将现在数字(n1+n2)乘以层级加入n3并清空n1,n2。最后sg*(n1+n2+n3)就是答案,sg为符号。细心揣摩表示数字的英语单词语法层级不难想到这个方法。

2.Spell checker

本题就是一个简单的模拟题,但是调试了很久都没有调试出来。后来放弃了一段时间,又突然调试出来了…没什么好说的。

3.Period

本题看数据规模,字符串即使扫描一遍都要O(n)的时间,所以不能接受扫描内部的任何循环。那么预处理必须非常的强。
如果换一个角度看周期性,前mk个字母以m为周期循环k次,那么前缀m(k-1)长的字符串和后缀m(k-1)长的字符串相同,这就联想到了KMP算法中next[]向量的预处理计算。故本题可以用KMP模式匹配做。
关于KMP模式匹配,由于十分抽象,而且下标边界较多易混淆,所以不好学,这里有一篇博文专门学习KMP,里面的代码和我日常习惯不同,但是看图可以给人一种恍然大悟的感觉。

第5课 二叉树I(Binary Trees I)(共3题)

1.Rebuild binary tree from sequences of infix order and post order

经典的二叉树递归算法,利用后根遍历找出跟结点,据此分割中根遍历的序列为左子树和右子树,反过来也可以分割后根遍历序列,递归这一过程即可。

2.Heapsort implementation

经典的数据结构最小堆,通过这个题顺便学习了一下最小堆和用最小堆实现的优先队列的写法。
主要有插入和取出并删除最小元素的算法,用数组模拟二叉树(堆)作为这个数据结构的主干,并记录最后一个元素位置(容易知道这个二叉树不会退化为链式结构,所以数组空间利用率极大)。插入时候先插入在最后一个元素位置再浮动,删除时将最后一个元素提到根结点,再浮动即可。

3.Binary Tree in Text

本题(文本二叉树)有两个部分,一是建树,而是遍历。
本题看了看考虑到树会退化为链,如果当作完全二叉树用数组储存则空间开销太大,所以只能使用链表的方法(或数组模拟链表,但是链表和数组模拟链表区别不大,唯一区别是后者不用释放空间,但是前者也要加以练习)。
那么既然是链表方法储存,则遍历容易给出。
那么树应该怎么读取建立呢?以下为具体算法,我做了比较多的尝试才给出来的,具体是:如果当前尝试建立某一结点的某子树,如果深度正确,就建立,并对新建的子树做相同递归过程,否则不建立,改为建立父节点的右子树。虽然这个过程不复杂,但是很妙!
二叉树除了掌握经典算法之外,由于变形很多,所以要是学会合理划分参数,建立递归,设计出每个题适合的不同算法。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值