1.本周学习总结
1.1思维导图
1.2.谈谈你对线性表的认识及学习体会。
- 线性表主要分为顺序存储结构和链式存储结构两种。其中顺序存储结构主要运用的是我们比较熟悉的数组的写法,而链式存储结构则运用的是后来学的链表。在建表前,二者都需要对结构体先做定义。随着学习的深入,调试的难度较之前也会大一些,没办法第一时间找到问题所在。经过pta的练习,能够对一些常出现的问题进行总结:如指针域未置空,申请空间失败,甚至是结构体名称上出现问题(这个问题比较弱智,一般都是手滑按错了)。本周的学习,pta上的题目是基于课本的分模块训练,对于插入删除查找进行了一定的函数训练,故而做到后面的编程题时,其实主要就是将前面的函数灵活结合运用。一开始写pta还是脱离不了课本,但是后期该现象出现好转,练熟分块的函数,在编写完整的程序时也会更得心应手一些。最大的体会是,对于程序当中每一句语句的意思都要自己捋清楚,强行硬套就像背题,脱离模板就会出错。
2.PTA实验作业
2.1.题目1:6-4 顺序表操作集
2.1.1设计思路(伪代码)
List MakeEmpty()
{
定义 L;
动态申请内存;
置空返回;
}
bool Insert(List L, ElementType X, Position P)
{
定义 i;
if 表满||位置不合法
cout<< "FULL"||"ILLEGAL POSITION" ;
return false;
end if
for L->Last + 1 to P //倒序后移
L->Data[i] = L->Data[i-1];
end for;
L->Data[i] = X; //插入
L->Last++;
}
Position Find(List L, ElementType X)
{
定义i;
for i=0 to L->Last
找到直接返回位置
end for
}
bool Delete(List L, Position P)
{
判断位置是否合法
定义 i;
for i=P to L->Last
}
2.1.2代码截图
2.1.3本题PTA提交列表说明。
1.编译错误
- 不小心丢进去了c++的语法,然后发现只能用c来着
2.返回空表
- 置为空表时应该使L->last=-1
3.插入数据时,答案错误
- 要掌握好临界值,确定初始化的L->last值,更改相应的变量(因为一开始写的时候,是令L->last=0,后面改的时候就有漏改的情况)
4.答案错误
- 题目设置要求,在判断条件的顺序上面,经过几次调试,输出的答案会不太一样,按照题目要求调整就可以啦
2.2 题目2 6-8 jmu-ds-链表倒数第m个数(单链表)
2.2.1设计思路(伪代码)
way1
int Find(LinkList L, int m)
{
定义 nodeNum; //节点数
定义 p;
p = L; //p来动
while p = p->next != NULL
计数
end while;
if 位置!合法 return -1; end if
for i = 0 to nodeNum - m + 1 //L动
L移动
end for
return data;
}
way2
int Find(LinkList L, int m)
{
定义 i=1;
定义 p=L;
while p = p->next !NULL //链没结束
跳过 m - 1 次;
then L 移动;
i++; //计数
end while;
if m 不合法 return -1;
返回 data
}
2.2.2代码截图
way 1
way 2
2.2.3本题PTA提交列表说明。
- 位置无效 段错误,答案错误
- 要增加一条位置判断语句
if (m<1 || m>nodeNum)return -1; //非法返回
2.3 题目3 7-2 一元多项式的乘法与加法运算
2.3.1设计思路(伪代码)
- 主要介绍俩函数
1.PlusResult
LinkList PlusResult(LinkList L1, LinkList L2)
定义 p1=L1->next, p2=L2->next, p3, temp, LPLus;
动态分配 LPlus并置空
p3 = LPlus; //保留头节点
if !p1 相加为 p2; end if
反之 为p1;
while p1 &&p2
compare with indexes
if != 将较大的存入p3并后移
else factor相加后存入
end if
end while
剩余链接上;
2.MultResult
void MultResult(LinkList L1, LinkList L2, LinkList &LMult)
定义 p1=L->next, p2=L->next, p, temp;
while p1
新生成head并置空 //p2的函数是为了生成一个新的链表,然后用于加法函数,所以这个head每次都要新生成一下
p = head;
while p2
新生成temp并置空
factor 相乘 index相加
存入后移;
end while
p->next=NULL
LMult = PlusResult(head, LMult); //调用加法函数
初始化结点
end while
2.3.2代码截图
1.调用加法函数
2.3.3本题PTA提交列表说明
- Q:一开始写加法函数,用了三个参数,在乘法当中调用函数则用了一个鬼畜的写法,大概是这样:PlusResult(L1,LMult,LMult);,程序出错,乘法无法运行。
- A:是一种比较鬼畜的尝试,经过这个之后中规中矩改写了PlusResult函数,把函数类型改成LinkList,就能使函数上下通用了😁
- Q: 出现很奇怪的数字(一开始只写加法函数的时候)
- A:整半天发现是index写成了factor(尴了个尬),输出就出错了
- Q:还很经常出现这种情况(叹气不大会用vs来着)
- A:百度了一下解决方案,其实基本上就是写的时候不小心或者没考虑全,方案如下:0xCDCDCDCD错误解决方法是结构体要初始化。链表的末尾一定要保持指向NULL才能用tmp->next==NULL来判断结尾,0xcdcdcdcd是一个未知值,新建的指针正好指向这个,但是不保证每次都是这个。所以,重点不是tmp的问题,而是tmp1->next=NULL。此时保证新建的尾节点只向NULL。
- Q:加法函数的做法会导致乘法结果的同类项不能合并:
- A:改用边算边插入的写法(调不出来来着qaq🤦
3.1 题目
题目
L1-6 幸运彩票
彩票的号码有 6 位数字,若一张彩票的前 3 位上的数之和等于后 3 位上的数之和,则称这张彩票是幸运的。本题就请你判断给定的彩票是不是幸运的。
输入格式:
输入在第一行中给出一个正整数 N(≤ 100)。随后 N 行,每行给出一张彩票的 6 位数字。
输出格式:
对每张彩票,如果它是幸运的,就在一行中输出 You are lucky!;否则输出 Wish you good luck.。
3.2 解题思路
两种算法
- 1.比较容易想到的暴力方法(利用%和/,化为数字和),加减求和直接判断写法(这种做法很直接,但是略微有些笨
- 2.利用字符串,将输入的数字以字符串的形式存取,通过ASCII码值和的比较来判断结果。
3.3 代码截图
3.4 学习体会
- 选取了天梯赛上的一道题目,是相对比较容易的一道题目。其实本来选取的是leecode上的一题很神奇地将时间复杂度从n3降到了n,不过是java的代码(看不太懂来着,本来以为只是看起来比较复杂,实际上真的很复杂qaq,代码如下。问了学姐,用到了hash树的原理,因为哈希树存的是键值对(看到这个程度我大概觉得自己应该是不能消化这一块的内容了。不过这里用的一个思想也是将字符转化为对应的ASCII码然后用hash等方法简便运算,所以就退而求其次找了天梯赛上的题目(代码不难,主要是想让自己记住字符转数字的判断方法
- 第三块内容在寻找优秀代码的过程当中,还是比较纠结的。leecode上面有带题解的优秀代码很多都是java或者python写的,当然评论区也会有网友们的一些写法也值得参考。在寻找过程当中,也尝试去找vector等stl容器的源码(寻思着掌握了比较好理解来着)但是太长了就有点自闭(寻思着下一次争取看一些源码叭,本学期打算先从一些比较简便的算法学起,再掌握源码,语法等。