1.学习总结
1.1查找的思维导图
1.2 查找学习体会
查找内容很多,像平均查找长度,平均二叉树插入删除时的调整,还有B树,哈希表,哈希冲突等重要内容,查找的内容也与我们平时生活联系很深。
本周还学习了Map,STL的一个容器,它提供一对一的hash,很多功能直接调用函数,很方便
- 变量声明:map<string, string> mapStudent;
- map的所有节点元素都是pair,pair有两个成员变量first,second ,第一个first是键值key,第二个second是实值value
- 插入元素:
(1)用insert函數插入pair:mapStudent.insert(pair<string, string>("r000", "student_zero"));
(2)用"array"方式插入:mapStudent["r123"] = "student_first";mapStudent["r456"] = "student_second"; - 查找:出现时,它返回资料所在位置,如果没有,返回iter与end函数返回相同
iter = mapStudent.find("r123");
if(iter != mapStudent.end())
cout<<"Find, the value is"<second<<endl;
else
cout<<"Do not Find"<<endl; - set使用方法:
begin()返回set容器的第一个元素
end() 返回set容器的最后一个元素
clear() 删除set容器中的所有的元素
empty() 判断set容器是否为空
max_size()返回set容器可能包含的元素最大个数
size()返回当前set容器中的元素个数
rbegin返回的值和end()相同
rend()返回的值和rbegin()相同 - 判断键值是否存在:
count() 用来查找set中某个某个键值出现的次数因为一个键值在set只可能出现0或1次,这样就变成了判断某一键值是否在set出现过了
2.PTA实验作业
2.1 题目1:是否二叉搜索树
2.2 设计思路
建树
如果为空树则为二叉搜索树
如果无左右孩子也为二叉搜索树
如果左孩子不为空
利用循环找到左子树最右节点
如果该节点的值大于根节点的值,则不满足非空左子树的所有键值小于其根结点的键值,不是二叉搜索树
如果右孩子不为空
利用循环找到左子树最左节点
如果该节点的值小于根节点的值,则不满足非空右子树的所有键值大于其根结点的键值,不是二叉搜索树
利用递归继续判断其他节点
2.3 代码截图
2.4 PTA提交列表说明
- 编译错误
bool返回类型应该是true或者false,但是判断是否为空时,我返回了NULL - 段错误
调试时发现卡在BinTree P=T处,是不是再进入这条语句时,又创建了一次BinTree P,类似于程序中出现俩个同名定义变量,于是把BinTree P这一句挪到了if语句外,但是结果与测试案例不符。所以按照题目中的一条条要求又重写了一次
2.1 题目2:QQ帐户的申请与登陆
2.2 设计思路
输入指令行数
输出指令
如果命令符为“L”
如果找不到该账号,输出ERROR: Not Exist
如果存在该账号
判断账户密码,如果正确,输出Login: OK,否则,输出ERROR: Wrong PW
如果命令符为“N”
如果找不到该账号,插入该新账号,输出New: OK
如果找到该账号,输出ERROR: Exist
2.3 代码截图
2.4 PTA提交列表说明
格式错误(这个没什么好说明的。。。)
2.1 题目3:航空公司VIP客户查询
2.2 设计思路
输入飞行记录行数N,最低里程K
循环输入N行飞行记录
判断已有记录中是否有当前身份证号码
如果没有,给里程值赋初值0
如果该记录里程值小于K大于0,里程值在原先基础上累加K
如果大于K,累加该记录里程值
循环结束
输入整数M
循环输入M行查询人的身份证号码
如果记录中没有该查询人,输出No Info
如果记录中有该查询人,输出其当前的里程累积值
循环结束
2.3 代码截图
2.4 PTA提交列表说明
运行超时,一开始理解成不能满足大数据,是类型定义错误,但是改完还是错的。。。尝试了很久,实在找不出来问题,询问了炳辉大佬,他说把c++的输出输出换成c的。百度下得到的是“输入数字没有问题,如果输入非整形的话,cin流的状态会被破坏,无法继续输入,可以用cin.clear清一下流的状态,或者把输入的部分放入while循环,输入错误时退出”所以改用scanf,printf反而方便一点
3.截图本周题目集的PTA最后排名
3.1 PTA排名
3.2 我的总分:2.5
4. 阅读代码
代码链接:https://blog.csdn.net/chenhanzhun/article/details/39529425
代码链接:https://blog.csdn.net/mdl13412/article/details/6655581
这俩篇博客的注释都很详细,头文件里的东西很复杂,但是调用map.h后续功能的实现都很方便,像本章学习的查找,如果用树来实现,建树,再遍历查找,代码量很大,但是调用Map的话,利用insert()和find(),几句代码就可以实现了,具体操作不需要我们来完成,知道原理就可以了,比如find()函数,如果找到它会返回一个迭代器指向键值为key的元素,如果没找到就返回指向map尾部的迭代器
5. 代码Git提交记录截图