博客作业05--查找
1 学习总结
1.1 查找思维导图
1.1 查找学习体会
对于这两周查找的学习,个人认为查找并不难,主要是要细心,尤其是在算ASL以及哈希表的构造时,虽然只是简单的运算,但一不小心也会算错。
对STL中Map的认识:
Map建立的是一棵红黑树,是从键(key0)到值(value)的映射。Map定义例如 map<int ,string> QQ,树中提供的是“QQ账号到QQ密码”的映射,int 就和数组中的下标一样,而string 就是对应的数据。在QQ中查找可以用QQ.find()函数,返回的是一个迭代器,若该下标不存在,返还end()。查找还能通过直接访问下标QQ[],类似数组的形式,但是若不存在,会插入数据,例如,QQ[3]不存在,访问过后,QQ中会插入QQ[3],而QQ[3]对应的值为0,这就导致了再次访问QQ[3]时,结果不为空。
2.PTA实验作业
题目1:6-2 是否二叉搜索树
设计思路
定义全局变量int pre=-1
bool IsBST ( BinTree T ){
if T为空,return true;
else {
if 递归左子树不是二叉搜索树 return false
if T->Data小于前一个数据pre return false
else 改变pre的值等于T->Data
if 递归右子树不是二叉搜索树 return false
}
return true
}
代码截图
PTA提交列表说明
提交列表说明:
本题最开始不是用中序遍历判断,而是对每个节点进行判断,判断该节点是否大于其左子树中的最大值,以及小于右子树中的最小值,代码较为复杂,后来改为用中序遍历判断是否为递增序列
这是原来的做法
题目2:7-1 QQ帐户的申请与登陆
设计思路
定义map<long long ,string> QQ
输入n
for i=0 to n
输入state,ID,Password
若 state为L{
若 QQ中没有该ID ,输出ERROR: Not Exist
若 QQ中存在该ID,且Password正确,输出Login: OK
若 QQ中存在该ID,但Password不正确,输出ERROR: Wrong PW
}
若 state为N{
若 QQ中没有改ID,输出New: OK,且将Password存入
若 QQ中存在该ID,输出ERROR: Exist
}
end for
代码截图
PTA提交列表说明
本题提交过程没有问题,但调试时有发现一个问题,在map中查找是可以用map.find()查找,也可以直接访问map[],两种查找的结果都一样,但直接访问map[]时,若map[]不存在,会直接插入,导致再次查找时结果为存在。
题目3:7-2 航空公司VIP客户查询
设计思路
定义map<string,long int> vip
输入VIP人数n和航程k
定义char ID[19];long int mile;
for i=0 to n
输入ID,mile
若mile小于k,让mile=k
vip[ID]+=k //ID 不存在时会直接插入,所以直接加
end for
for i=0 to n
输入 ID
若vip中有该ID,输出vip[ID]
若没有,输出 No Info
end for
代码截图
PTA提交列表说明
本题主要是运行超时的问题,本来定义ID的类型为string,改成字符数组后效率更快。
3.截图本周题目集的PTA最后排名
3.1PTA排名
3.2我的总分:2.5
4.阅读代码
题目:反片语
输入一些单词,找出满足如下条件的单词:该单词不能通过字母重排,得到文本中的另一个单词。在判断是否满足条件时,字母不分大小写,但在输出是应保留输入中的大小写,按字典序进行排序(所有大写字母在所有小写字母的前面)。
代码:
#include<iostream>
#include<string>
#include<cctype>
#include<vector>
#include<map>
#include<algorithm>
using namespace std;
map<string,int>cnt;
vector<string>words;
//将单词s进行“标准化”,大写转化为小写,然后对字母进行排序
string repr(const string &s)
{
string ans=s;
for(int i=0;i<ans.length();i++)
{
ans[i]=towlower(ans[i]);//把所有字母变为小写字母,方便统计
}
sort(ans.begin(),ans.end());//对单词中的字母进行排序便于比较
return ans;
}
int main()
{
int n=0;
string s;
while(cin>>s)
{
if(s[0]=='#')break;
words.push_back(s);
string r=repr(s);
if(!cnt.count(r))//假如没有找到
{
cnt[r]=0;
}
cnt[r]++;
}
vector<string>ans;
for(int i=0;i<words.size();i++)
{
if(cnt[repr(words[i])]==1)//单词唯一
{
ans.push_back(words[i]);
}
}
sort(ans.begin(),ans.end());
for(int i=0;i<ans.size();i++)
{
cout<<ans[i]<<endl;
}
return 0;
}
代码中把每个单词都转化为小写字母再进行排序,代码中直接调用库函数进行小写转化以及排序,大大减少了代码量,然后在进行统计。“标准化”后在map中查找,若存在说明能转化,改变值,若不存在,则说明该单词唯一,无法转化为其他单词。
本题中对若果没有想到单词进行“标准化”转换,就很难用map简化代码。
5. 代码Git提交记录截图