1.学习总结
1.1查找的思维导图
1.2 查找学习体会
- 1、map简介
map是一类关联式容器。它的特点是增加和删除节点对迭代器的影响很小,除了那个操作节点,对其他的节点都没有什么影响。
对于迭代器来说,可以修改实值,而不能修改key。 - 2、map的功能
自动建立Key - value的对应。key 和 value可以是任意你需要的类型。 - 3、查找方式及使用
目前知道的有map.find(关键字) 和 map.count(关键字)两种,使用count,返回的是被查找元素的个数。如果有,返回1;否则,返回0。注意,map中不存在相同元素,所以返回值只能是1或0。使用find,返回的是被查找元素的位置,没有则返回map.end()。
2.PTA实验作业(4分)
2.1 题目1:7-1 QQ帐户的申请与登陆
2.2 设计思路(伪代码或流程图)
#include<bits/stdc++.h>
#include<iostream>
using namespace std;
定义map<string,string>a;
int n,i;
char k[2],QQnum[12],password[25];//新老用户选择,QQ号,QQ密码
输入行数n
for i=0 to n输入选择k如果是老用户输入QQnum,passwordif(a[QQnum].empty()){//不存在 输出"ERROR: Not Exist\n"}else{如果密码正确,输出"Login: OK\n"否则 输出"ERROR: Wrong PW\n"}end if如果是新用户 输入QQnum,passwordif(a[QQnum].empty()){//不存在 a[QQnum]=password;//创建账号输出"New: OK\n"}else{//存在 输出"ERROR: Exist\n"//账号已存在}end if
2.3 代码截图
2.4 PTA提交列表说明。
这题主要是原来代码L和N的判断用的是字符c类型输入判断的,但是输出结果一直不对,看网上代码用的字符串数组来判断,修改后就可以了。
2.1 题目2:6-3 二叉搜索树中的最近公共祖先
2.2 设计思路(伪代码或流程图)
int LCA( Tree T, int u, int v ){//找最近公共祖先如果调用Find函数发现是空树或者找不到 返回ERRORif(v == T->Key || u == T->Key) return T->Key;if v节点和u节点分别在T->Key两侧 return T->Key;return (v<T->Key?(LCA(T->Left,u,v)):(LCA(T->Right,u,v)));
}
int Find(Tree BST, int X) {//在树种寻找X节点if (!BST) return 0;if 在树中找到该节点 返回1if (X > BST->Key) {return Find(BST->Right, X);//从该节点的右孩子继续查找}else if (X < BST->Key) return Find(BST->Left, X);//从做孩子就继续查找
}
2.3 代码截图
2.4 PTA提交列表说明。
部分正确:一开始没有考虑到v == T->Key || u == T->Key时的情况,导致部分测试点过不了,增加条件即可。
2.1题目3:7-2 航空公司VIP客户查询
2.2 设计思路(伪代码或流程图)
int main(){int n,k,i;//n为查询人数k为最低里程输入n,kchar idcard[20];//定义身份证号long long flyway;//定义里程map<string,long long>Map;for i=0 to n {输入身份证号输入里程数如果该用户里程数<最低里程数 flyway=k;if(!Map.count(idcard)) Map[idcard] = 0;//不是会员Map[idcard]+=flyway;//累加里程数}输入要查询的人数nfor i=0 to n {输入身份证号if(!Map.count(idcard)) 输出"No Info\n"//不是会员 else 输出该会员里程数}
}
2.3 代码截图
2.4 PTA提交列表说明。
这题参考网上的代码自己慢慢理解map怎么用的,部分正确出现的问题主要是超时,把所有cin改成scanf,再把数组的大小改一下,就通过了,试着试着通过的一道题。
3.截图本周题目集的PTA最后排名
本次题目集总分:175分
必做题共:145分
3.1 PTA排名(截图带自己名字的排名)
(32林艺薇)
3.2 我的总分:145
4. 阅读代码(必做,1分)
- HashMap中红黑树的查找函数find()实现
/** * 调用树的find()函数 */ final TreeNode<K,V> getTreeNode(int h, Object k) { return ((parent != null) ? root() : this).find(h, k, null); }
[java] view plain copy/** * 从根节点p开始查找指定hash值和关键字key的结点 * 当第一次使用比较器比较关键字时,参数kc储存了关键字key的 比较器类别 */ final TreeNode<K,V> find(int h, Object k, Class<?> kc) { TreeNode<K,V> p = this; do { int ph, dir; K pk; TreeNode<K,V> pl = p.left, pr = p.right, q; if ((ph = p.hash) > h) //如果给定哈希值小于当前节点的哈希值,进入左节点 p = pl; else if (ph < h) //如果大于,进入右结点 p = pr; else if ((pk = p.key) == k || (k != null && k.equals(pk))) //如果哈希值相等,且关键字相等,则返回当前节点 return p; else if (pl == null) //如果左节点为空,则进入右结点 p = pr; else if (pr == null) //如果右结点为空,则进入左节点 p = pl; else if ((kc != null || (kc = comparableClassFor(k)) != null) && (dir = compareComparables(kc, k, pk)) != 0) //如果不按哈希值排序,而是按照比较器排序,则通过比较器返回值决定进入左右结点 p = (dir < 0) ? pl : pr; else if ((q = pr.find(h, k, kc)) != null) //如果在右结点中找到该关键字,直接返回 return q; else p = pl; //进入左节点 } while (p != null); return null; }
链接:https://blog.csdn.net/ymrfzr/article/details/51243766
函数注释很详细,find()函数里有对多种情况进行讨论,直接调用map.h后续功能的实现就很方便,像查找,如果用树来实现,建树,再遍历查找,代码量很大,但是调用Map的话,利用find(),代码精简了很多,我们只要知道原理就可以了。find()函数原理:如果找到会返回一个迭代器指向键值为key的元素,如果没找到就返回指向map尾部的迭代器。