• DS博客作业07--查找


    1.本周学习总结

    1.1思维导图


    1.2学习体会

    • 查找这一章节,有着好几个不同的查找法,所以每题使用的查找方法也可能不一样,查找的代码量没有图代码量那么多,但是还是要用心去学,对于老师一直强调的stl容器,STL容器有顺序容器和关联容器还有容器适配器,c++容器提供一个键值对(key/value)容器,其中map会根据key自动排序,在写题的时候用到容器回方便很多,对于删除和申请空间,容器会自动帮我们做好,需要的头文件#include <map>,关联容器有map、set。还有map是基于红黑树,且键唯一,元素默认按键的升序排序。vector 是数组的内部数据结构,在末尾增加或这删除元素所需要时间与元素无关,在中间或者开头增加或者元素所需时间是随元素数目呈线性变化,它会开辟一定大小的数组,随着元素的增加,空间不够之后,会自动采取扩容,并且遵循以原空间大小的2倍重新开辟一块空间将就空间的元素挪到新的空间上,在继续添加元素的扩容原则。

    2.PTA实验作业

    2.1题目1:6-2 是否二叉搜索树

    2.1.1设计思路

    定义全局变量lastNode来保存上一个结点的值
    如果树空,返回true
    递归左子树,如果左子树为空或者T->Data小等于lastNode,返回false;
    lastNode=T->Data;
    递归右子树,如果右子树为空,返回false;
    

    2.1.2代码截图

    2.1.3本题PTA提交列表及说明

    • 这题最开始的想法假定当前结点值为k,对于二叉树中每个结点,判断器左孩子的值是否小于k,其右孩子的值是都大于k,如果所有结点都满足该条件,则该二叉树是一颗二叉搜索树。但是后面提交时错误的例如层次遍历下序列为(10,5,15,#,#,6,20)它符合上面的条件,但是它并不是一颗二叉搜索树,后面尝试很多方法后发现,判断其左子树最大值是否大于lastNode的值,如果是,则该二叉树不是二叉搜索树,如果不是,则接着判断右子树最小值是否小于或等于last Node的值,如果是,则不是二叉树,反之则是。

    2.2题目2 6-3 二叉搜索树中的最近公共祖先

    2.2.1设计思路

    查找u和v结点是否都存在于树中,有一个不存在则直接返回ERROR;
    如果都存在则进行下面步骤:
    if(u==v)返回u;
    else 
        while(1)
            if(u和v在根节点两侧或者根节点等于u或v的某个值)返回根节点的值;
            if(u和v在同侧)递归调用该侧的子树;
    
    

    2.2.2代码截图

    2.2.3本题PTA提交列表及说明


    • 根据测试点一个个去对,两结点是兄弟和两结点重合 发现是多写了v>p->Key,原以为还有v大于子树结点的情况,是多余的。

    2.3题目3 7-1 QQ帐户的申请与登陆

    2.3.1设计思路

    定义一个string和stirng类型的map的遍历User
    输入数据个数n
    定义命令符(N和L)
    定义用户密码
    for i=0 to n
        输入用户账户和密码
        如果读到L即表示登陆
                如果查找的账号与返回指向User的账号相对应则表示账号已经存在,输出ERROR:Exist
                else
                      如果账号已存在但是密码不对应,输出ERROR:Wrong PW;
                      对应的话就输出Login:OK;
         而如果读到的是N,进行新建账户
                如果输入的账号在User中查找与返回指向User 账号相对应,然后数组方式将密码赋给User,并输出New:OK ;
                不对应的话就输出ERROR:Exist;
                
    

    2.3.2代码截图


    2.3.3本题PTA提交列表及说明

    这题 一直困扰我的是不知道账号密码 该怎么处理,是到底用之前学到字符数组呢还是怎么弄,脑子里一直想,一直无从下手,试了几次以失败告终,后来想 会不会有什么容器 可以帮我处理这些字符对应的问题,果不其然map容器做的到,后面上csdn查找map相关的函数,当中的find()和end()函数恰好能解决账号和密码分别是否对应的问题,find():当所查找的关键key 也就是账号出现时,它返回数据所在对象的位置,如果没有,返回与恩典函数的值相同,end():返回指向User 末尾的迭代器(这个地方我现在也不是很懂)。User.fin(num)==User.end() 很关键,发现map真的很好用,它可以自动建立key-value的对应 也就是这题当中账号和密码的对应,前面定义一个string和stirng类型的map的遍历User,就是作用于此,账号和密码都是字符串类型。这题懂得map存储和遍历的原理之后写起来就简单了。
    

    3阅读代码

    3.1题目 未检录人数

    3.2解题思路

    定义一个长整型的变量ll
    把n和num初始化为0;
    定义一个字符串类型的s 变量;
    输入念的名字数n;
    定义一个string ,int类型的my_map;
    for(1 to n )
          输入名字字符串s
           如果返回my_map中名字s被查找的个数等于0时,未及时检录的同学数量自增1;
           如果map中不含有插入s的话则bool为true,迭代器指向插入的s;如果map中已经含有s,则bool为false,返回的迭代器指向对应的map中已经存在的s
           输出未及时检录的同学的数量num
    

    3.3代码截图

    3.4学习体会

    当中学会了更多的map容器里的函数,其中有insert 函数,这个insert函数的实参是map<string,int>。是一个新创建的pair对象,将直接插入到map容器中。my_map.insert(make_pair(s,0));这条语句我愣是理解了很久,后面上网查找各种有关资料,发现对于insert的返回值,是一个pair 类型的,所以中间的参数用到的make_pair函数,而这个函数恰巧可以生成一个pair对象,这个函数很简洁,返回值是一个pair结构,其中第一个元素是一个迭代器,第二个元素是一个bool类型,根据以上结果:如果原来的map中不含有插入的元素,则bool为true,迭代器指向插入的元素;如果map中已经含有插入的元素了,则bool为false,返回的迭代器指向对应的map中已经存在的元素,这题答案虽然很简约但是可以看出功力非常之深厚。不知道 我这 理解对不对。好难啊。
    
  • 相关阅读:
    国外物联网平台初探(一) ——亚马逊AWS IoT
    国内物联网平台初探(七) ——Ablecloud物联网自助开发和大数据云平台
    国内物联网平台初探(六) ——庆科云FogCloud
    国内物联网平台初探(五) ——机智云IoT物联网云服务平台及智能硬件自助开发平台
    国内物联网平台初探(四) ——京东微联
    国内物联网平台初探(三) ——QQ物联·智能硬件开放平台
    国内物联网平台初探(二) ——阿里云物联网套件
    国内物联网平台初探(一) ——百度物接入IoT Hub
    iOS开发技巧
    【Oracle】RAC添加新节点
  • 原文地址:https://www.cnblogs.com/zrjAIRON/p/11029185.html
Copyright © 2020-2023  润新知