博客作业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提交记录截图





posted @ 2018-05-26 21:35  嘿嘿渣  阅读(230)  评论(0编辑  收藏  举报