• DS博客作业07--查找


    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找位置。
  • 相关阅读:
    asp.net C# 实现阿里大鱼和云片网短信接口类
    asp.net C# 实现微信接口权限开发类
    asp.net C# 实现微信服务器配置
    php学习资料
    阿里云ECS升级OpenSSL记录
    Docker(十三):OpenStack部署Docker集群
    Docker(十二):Docker集群管理之Compose
    Docker(十一):Docker实战部署HTTPS的Tomcat站点
    Docker(十):Docker安全
    Docker(九):Docker容器卷插件
  • 原文地址:https://www.cnblogs.com/zyxaa/p/11032185.html
Copyright © 2020-2023  润新知