博客作业05--查找

时间:2021-08-07 03:25:36

1.学习总结

1.1查找的思维导图
博客作业05--查找

1.2 查找学习体会

  • 查找这一章节相对于树来说较为简单,整体的思路比较清晰,几种不同的查找方式都提高了对数据查找的速度,减少了时间复杂度。但是对于不同的方式使用的情况也不同,其中也含着许多小的知识点,需要稳固基础。

2.PTA实验作业

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

1.设计思路

定义一个指针p
if(T为空树)
return true
if(T只有一个结点) 
return true
先让p指向T->left,然后遍历其所有右子树,若p->data大于T->data,则return false;再让p指向T->right,接着遍历其所有左子树,若p->data小于T->data,则return false。
因为对所有的结点都适用上述判断方法,所以利用递归return IsBST(T->Left)&&IsBST(T->Right);。

2.代码截图

博客作业05--查找

3.PTA提交列表说明

博客作业05--查找

  • 无问题。

题目2:7-1 QQ帐户的申请与登陆

1.设计思路

声明map<string, string> mm
定义三个字符串型变量s1, s2, s3
先对s1进行判断
若为N则为申请功能,在map中寻找s2,若返回mm.end()则说明map中没有这个账号,则将账号密码make_pair(s2, s3),然后mm.insert(make_pair(s2, s3));若找到s2,cout<<"ERROR: Exist"。
若为L则为登录功能,首先获得map的迭代器map<string, string>::iterator it,在map中寻找账号,若找到则校验密码是否一致;若没有找到账号则cout<<"ERROR: Not Exist"

2.代码截图

博客作业05--查找

3.PTA提交列表说明

博客作业05--查找

  • 一开始不懂得map对数据的处理方式。
    解决方法:百度了对map的讲解,以及map函数的使用。

题目3:7-2 航空公司VIP客户查询

1.设计思路

声明 map <string,int> num
输入时,对输入的len进行判断,若len<=k,则在num[id]上加k,若len>k,则直接加len。
输出时,先在map中寻找该id,若找到则输出num[id]的值,若找不到则printf("No Info\n")。 

2.代码截图

博客作业05--查找

3.PTA提交列表说明

博客作业05--查找

  • 本题对map的count函数存在超时问题,导致我在一开始怎么样都过不了。
    解决方法:删掉了输入时对id的存在问题的判断,虽然过了,但是还是觉得怪怪的。

3.截图本周题目集的PTA最后排名

3.1 PTA排名

博客作业05--查找

3.2 我的得分:2.5

4. 阅读代码

复杂链表的复制。
复杂链表即链表结点结构中除了数据域data和next指针之外,还有一个指向随机结点的随机结点指针域。要对这种链表进行复制其难点是如果按照和普通链表一样一个一个结点向后复制的话,就无法正确的找到随机指针域所指向的结点。

#include<iostream>
#include<unordered_map>
using namespace std;

struct RandomListNode {
    int label;
    RandomListNode *next, *random;
    RandomListNode(int x) : label(x), next(NULL), random(NULL) {}
};

RandomListNode *copyRandomList(RandomListNode *head)
{//使用容器
    unordered_map<RandomListNode*, RandomListNode*> tmp;
    RandomListNode *ret = new RandomListNode(0);
    RandomListNode *p = head;
    RandomListNode *q = ret;

    while (p)
    {
        RandomListNode *copy = new RandomListNode(p->label);
        tmp[p] = copy;
        q->next = copy;
        q = q->next;
        p = p->next;
    }
    p = head;
    while (p)
    {
        if (p->random)
            tmp[p]->random = tmp[p->random];

        p = p->next;
    }

    return ret->next;
}
  • 这里我们知道哈希表可以通过key值对应相应的value值,那么就可以把每个结点的地址设为key值和value值放入一个哈希表之中。先把链表按照普通链表复制一样一个一个结点的复制(此时复制只包括data域和next指针域),并同时把链表的所有结点都通过结点地址映射到哈希表的相应位置。最后再从头遍历一遍原链表,当遇到某个结点的随机指针域不为空的时候,就通过哈希表的映射关系把随机指针赋到复制链表相应结点的随机指针域之中。

5. 代码Git提交记录截图

博客作业05--查找