7-2 Reversing Linked List
7-2 Reversing Linked List
https://pintia.cn/problem-sets/16/problems/664
思路:遍历2^n遍,将各个节点按照顺序串成双向链表。然后两个指针一静一动开始遍历,中间间隔k个元素时逆序输出,然后不断循环。最后如果不足K个时顺序输出。
7-2 Reversing Linked List
https://pintia.cn/problem-sets/16/problems/664
思路:遍历2^n遍,将各个节点按照顺序串成双向链表。然后两个指针一静一动开始遍历,中间间隔k个元素时逆序输出,然后不断循环。最后如果不足K个时顺序输出。
7-3 Pop Sequence
https://pintia.cn/problem-sets/16/problems/665
第一遍做时,为了比较严谨好看,把栈做成了内存动态分配+结构体的形式,类似的还有一个pop序列和对应指针等变量,结果把我给搞晕了,中间有个样例会溢出导致异常,头昏脑胀半天没找出bug。
后来直接重构了代码,栈和pop序列都用了简单的int数组,并且第二遍做的时候思路也更清晰了一点,比较快做完了。
思路比较简单:按照1,2,3,……,n的顺序不断push进栈中,每次push完检测栈顶元素是否和当前pop序列中元素相等(相等就说明该序列是可行的),如果是,就不断pop弹出,然后继续push进栈。这个过程中如果栈满了,那么直接跳出循环。
循环结束后,检测栈和pop序列是否为空,如果是,说明这个序列是一个可能的栈弹出序列(”is a possible pop sequence of the stack.”),输出”YES”。反之如果还有元素,说明不能该序列是不可能的,输出”NO”。
半天没想起来这道题的输入怎么构建一棵树……盯着题看了好久才想起来:首先是用结构体数组存储各节点,一个节点包括data和左、右孩子;其次新建一个数组,标记所有是左/右孩子的节点,最后剩下的唯一个没有被标记过的节点就是树根。
构建好树之后就比较简单了,可以利用二叉树本身的性质,使用递归判断是否是同构。一棵树和另一棵树同构,在树根一样的情况下,当且仅当树根A的左右孩子分别和树根B的左右孩子同构。类似的,可以一直递归到判断两个叶子节点是否相互同构。
7-2 一元多项式的乘法与加法运算
https://pintia.cn/problem-sets/15/problems/710
首先大致思路是做好输入输出之后,先做加法(一是比乘法简单,二是后面乘法也会用到加法)再做乘法。
加法:加法的过程其实和上一道题”两个有序链表的合并“非常相似,只不过这里的合并是按照系数和指数来进行的。上一题的一些坑这里也都有,因为遇到过,也比较容易避开。
乘法:实现了加法之后,乘法其实比较容易。将两个多项式A、B相乘的结果拆分为把多项式A中各项(a,b,c,…)和多项式B相乘的结果 累加。其中一个项a和一个多项式B相乘的结果拆分为一个项a和多项式B中各项(x,y,z,…)相乘的结果 累加。最后再分成一个项a和一个项x的乘积。反过来再利用已实现的多项式加法函数进行累加即可(把一个项视作只有一项的多项式)。
这一篇主要总结自第七章”C++高级语法”中的第7-14节, 包含面向对象编程的IO部分,主要有:重载输入输出运算符、IO流和两种文件的IO操作(读写文件)。
C++三种限制访问符:
除了注意要写friend关键字外,因为友元函数并不是成员函数,所以不需要类作用域限定符。