zoukankan      html  css  js  c++  java
  • 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中已经存在的元素,这题答案虽然很简约但是可以看出功力非常之深厚。不知道 我这 理解对不对。好难啊。
    
  • 相关阅读:
    LeetCode对撞指针汇总
    167. Two Sum II
    215. Kth Largest Element in an Array
    2018Action Recognition from Skeleton Data via Analogical Generalization over Qualitative Representations
    题解 Educational Codeforces Round 84 (Rated for Div. 2) (CF1327)
    题解 JZPKIL
    题解 八省联考2018 / 九省联考2018
    题解 六省联考2017
    题解 Codeforces Round #621 (Div. 1 + Div. 2) (CF1307)
    题解Codeforces Round #620 (Div. 2)
  • 原文地址:https://www.cnblogs.com/zrjAIRON/p/11029185.html
Copyright © 2011-2022 走看看