一、PTA实验作业(5分)
题目1:最长连续递增子列(顺序表)
设计思路
定义整型变量 i,j,最长连续递增子列开始的起始位置M,最长连续递增子列的长度max;
List L;
输入链表长度;
for i=0 to length //链表初始化
输入L->data[i];
L->length=n; //链表长度为n
for i=0 to length
L->num[i]等于1; //存放该数所对应的最长连续递增子列的长度,先默认为1
//寻找最长最长递增子列 //
for i=0 to length
for j=0 to length{
如果 data[j]小于data[j+1]) num[i]++; //记录每个元素的最长递增子列中元素个数
没有递增下去即结束;
}
for i=0 to length{ //寻找递增子列数最大的子列
如果num[i]大于max max等于num[i],M等于i;
}
for i=M to M+max-1 //输出最长子列
输出data[i] ;
输出data[i]; //最后一个输出不带空格
代码截图
PTA提交列表说明
- 编译错误:一开始的思路是弄了三个数组,一个数组储存数据,一个数组记录下每个数的最长连续递增子列,当这个数组的长度大于之前所有数组的长度,则用第三个数组把它保留下来,,,但是事实证明这个思路非常不可取,代码非常冗长而且凌乱。
- 然后我就重新构思:用另一个结构体变量来存放该数所对应的最长连续递增子列的长度,然后比较这个变量即可找到目标子列的开头和长度,最后输出相对应的数据即可。
题目2:链表倒数第m个数(单链表)
设计思路
寻找倒数第m个数的值函数 //L:单链表 m:倒数第m个位置
定义整型变量i,链表总元素个数,;
LinkList p=L;
while p不是空链表{
n加一;
p指向下一个节点; //统计链表元素总个数
}
if m>=n 或 m<0 返回-1;
num=n-m+1; //倒数第m个数应为正数第num个数
p重新指向头结点;
if num大于零且小于n{
for i=1 to i<num //寻找第num个数
p指向下一个节点;
m=p->data; //目标位置所存储的数据
return m;
}
else
返回-1;
代码截图
PTA提交列表说明
- 多种错误:一开始的思路没有乱,没有考虑到num的位置应该怎么找,,,
- 部分正确:位置无效—没有考虑的m不在合理的范围之内的情况,对m和n的取值范围进行判断,不合理时返回-1即可。
题目3:两个有序序列的中位数(有序表)
设计思路
主函数
定义整型变量 n;
List La,Lb,Lc;
输入n;
创建链表La;
创建链表Lb;
归并La和Lb到Lc; //归并有序表
输出Lc中data[n-1]; //直接输出归并后的有序表的中位数
void CreateList(List &L,int n) //创建长度为n的有序表
void Union(List &LA,List &LB,List &LC) //归并两个有序表
{
定义整型变量 i=0,j=0,k=0;
申请空间;
while i<LA->length且j<LB->length {
如果 LA->data[i]小于LB->data[j]{
LC->data[k]等于LA->data[i];
i++;k++; //把比较小的数放入LC
}
否则{
LC->data[k]等于LB->data[j];
j++;k++;
}
}
while LA中的数没有放完{
LC->data[k]等于LA->data[i];
i++;k++;//直到LA全部放完
}
while LA中的数没有放完 {
LC->data[k]等于LB->data[j];
j++;k++; //直到LA全部放完
}
修改LC的长度为n;
}
代码截图
PTA提交列表说明
- 在编译器里调试成功了才提交PTA的,最开始的思路是写三个函数,一个创建,一个归并且排序,最后一个找中位数,,,
- 其实只要直接输出归并后的第n个位置的数即可。
- 归并函数中需要注意的是重复的数据应一同归并,不能删除~
二、截图本周题目集的PTA最后排名
1.顺序表PTA排名
2.链表PTA排名
3.我的总分:204
三、本周学习总结
1.谈谈你本周数据结构学习时间是如何安排,对自己安排满意么,若不满意,打算做什么改变?
学习安排:上课前稍微预习,中午或者晚上有空就写写PTA的题目,看看书复习上课内容。
不满意:做题速度太慢,即使花很多时间也没有什么成效,这样很挫败,反而会写不下作业;也许我不应该一直想要完成作业,可能多看点书复习知识会好一些吧。
2.谈谈你对线性表的认识?
- 我的认识:对数据处理更方便的操作。
- 线性表是具有相同特性的数据元素的一个有限序列,它有顺序存储结构和链式存储结构,链式存储结构会比顺序存储结构要方便—比如区间元素的删除:链表只需改变指针的指向,再删除结点即可,而顺序表需要移动删除或增加的元素后面的所有元素,时间复杂度更大。
3.代码Git提交记录截图
过程:
四、代码互评
林岑的代码
我的代码
- 不同之处:林岑用的是单链表,我用的是有序表,链表的申请空间比较自由,有序表的大规模输入的测试必须要把maxsize设的非常大。
- 总体的比较过程还是比较相似的。