1.本周学习总结(0--2分)
1.思维导图
2.谈谈你对查找运算的认识及学习体会。
- 这一章主要学习了很多查找的算法,还有包括很多stl容器的使用,特别是map容器的使用。查找算法包括顺序查找,折半查找等算法,都各有各的优缺点和特点。其中这章的重点还是二叉排序树,以及map容器中使用的红黑树也是基于二叉排序树的。另外就是哈希表的查找和应用。
- map映射容器的元素数据是由一个键值和一个映射数据组成的,键值与映照数据之间具有一一映照的关系。map容器的数据结构也采用红黑树来实现的,插入元素的键值不允许重复,比较函数只对元素的键值进行。元素默认按键的升序排序。给map容器添加元素可通过两种方式实现,一是通过insert成员函数实现,二是使用迭代器访问,iter->first指向元素的键,iter->second指向键对应的值。
2.PTA实验作业(6分)
2.1.题目1:是否二叉搜索树
2.1.1设计思路(伪代码)
bool IsBST ( BinTree T )
{
if T为空 return true;
if T的左子树右子树均为空 return true;
L=T->Left;
R=T->Right;
if L不为空即存在左子树
{
while(L的右孩子不为空)
L=L->Right;//直接找出根节点的左孩子中最大的数
if L->Data>T->Data
return false;
}
end if
if R不为空即存在右子树
{
while(R的左孩子不为空)
R=R->Left;//直接找出根节点的右孩子中最小的数
if R->Data<T->Data
return false;
}
end if
return true;
}
2.1.2代码截图(注意,截图,截图,截图。不要粘贴博客上。)
2.1.3本题PTA提交列表说明。
- 这题实际上比较简单,没有太多的问题。主要就是刚开始的时候的想法是,直接遍历左子树和右子树,定义根节点的值为k;然后遍历左子树和右子树,若左子树上的每一个值都比根节点小,右子树上每个值都比根节点大,则是二叉搜索树,这样做确实是对的,但是就是比较麻烦一点。然另一种方法比较后简单,直接找左子树的最右的结点以及右子树的最左的结点,若一个小于根节点,一个大于根节点,这样符合二叉搜索树的定义,算法比较简单。
2.2.题目2:QQ帐户的申请与登陆
2.2.1设计思路(伪代码)
int main()
{
定义字符串 a, b, c;
int n;
输入 n;
while (n--)
{
输入a,b,c;
if a == "N" //注册
{
if (mp.find(b) == mp.end())//申请成功
{
mp[b] = c;
输出New: OK
}
else 输出ERROR: Exist
}
else
{
if mp.find(b) == mp.end() //账号找不到
{
输出ERROR: Not Exist
}
else if mp[b] != c //密码错误
{
输出ERROR: Wrong PW
}
else
{
输出Login: OK
}
}
}
}
2.2.2代码截图
2.2.3本题PTA提交列表说明。
- Q1:刚开始不知道账号密码怎么处理
- A1:后来运用map容器,处理字符和密码对应的问题,通过下标操作符获取元素,然后给获取的元素赋值,看其是否对应。
2.3.7-2 航空公司VIP客户查询
2.3.1设计思路(伪代码)
int main()
{
定义map包含身份证号码和里程数
int N, M, K;
定义字符数组 ID[20];
输入 N ,K;
for int i=0 to i < N
int range;
long long temp;
输入ID,range;
if ID最后一位不为X
从ID中读十八位到temp
}
else{
从ID中读十七位到temp
temp = -temp;
}
if(range < K){
range = K;
}
p[temp] += range;
}
输入M;
for int i=0 to i < M
long long temp;
输入ID
if ID最后一位不为X
从ID中读十八位到temp
}
else{
从ID中读十七位到temp
temp = -temp;
}
if p[temp] 不为0
输入里程值
else
输出No Info
}
}
return 0;
}
2.3.2代码截图
2.3.3本题PTA提交列表说明。
- 依然主要是map容器的使用。
3、阅读代码(-2--2分)
3.1 题目
给定仅有小写字母组成的字符串数组 A,返回列表中的每个字符串中都显示的全部字符(包括重复字符)组成的列表。例如,如果一个字符在每个字符串中出现 3 次,但不是 4 次,则需要在最终答案中包含该字符 3 次你可以按任意顺序返回答案。
3.2 解题思路
- 先考虑一般情况:数组中字符串数量大于等于2个 此题的本质为求一个字符串数组中每个字符串的公共字符(重复多次计数),采用类似动态规划的思想,整体的公共字符必然是某几个字符串的公共字符。 那么整体的公共字符必然是前俩个字符串的公共字符,接下来问题的关键就在于,如何求解俩个字符串的公共字符(即实现same_substr函数) 由于要考虑到重复出现的字符,而find方法只能返回首次出现的位置,所以需要采用一个数组来记录某个字符最近一次被找到的位置。如果再次遇到该字符,那么将会从该位置后面开始寻找。
- 接下来考虑特殊情况:字符串数组长度为0:那么公共字符数组为空字符串。数组长度为1:那么公共字符数组即为仅有的字符串中所有字符
- 最后只需要将字符串转化为字符数组即可。
3.3 代码截图
3.4 学习体会
- 先找前两个字符的公共元素,利用map容器中的find找位置。