DS博客作业07--查找

1.本周学习总结(0--2分)

1.思维导图

DS博客作业07--查找_第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->DataData 
        return false;
    }
    end if
    return true;
}

2.1.2代码截图(注意,截图,截图,截图。不要粘贴博客上。)

DS博客作业07--查找_第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代码截图

DS博客作业07--查找_第3张图片
DS博客作业07--查找_第4张图片

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代码截图

DS博客作业07--查找_第5张图片
DS博客作业07--查找_第6张图片

2.3.3本题PTA提交列表说明。

  • 依然主要是map容器的使用。

3、阅读代码(-2--2分)

3.1 题目

给定仅有小写字母组成的字符串数组 A,返回列表中的每个字符串中都显示的全部字符(包括重复字符)组成的列表。例如,如果一个字符在每个字符串中出现 3 次,但不是 4 次,则需要在最终答案中包含该字符 3 次你可以按任意顺序返回答案。

DS博客作业07--查找_第7张图片
DS博客作业07--查找_第8张图片

3.2 解题思路

  • 先考虑一般情况:数组中字符串数量大于等于2个 此题的本质为求一个字符串数组中每个字符串的公共字符(重复多次计数),采用类似动态规划的思想,整体的公共字符必然是某几个字符串的公共字符。 那么整体的公共字符必然是前俩个字符串的公共字符,接下来问题的关键就在于,如何求解俩个字符串的公共字符(即实现same_substr函数) 由于要考虑到重复出现的字符,而find方法只能返回首次出现的位置,所以需要采用一个数组来记录某个字符最近一次被找到的位置。如果再次遇到该字符,那么将会从该位置后面开始寻找。
  • 接下来考虑特殊情况:字符串数组长度为0:那么公共字符数组为空字符串。数组长度为1:那么公共字符数组即为仅有的字符串中所有字符
  • 最后只需要将字符串转化为字符数组即可。

3.3 代码截图

DS博客作业07--查找_第9张图片
DS博客作业07--查找_第10张图片

3.4 学习体会

  • 先找前两个字符的公共元素,利用map容器中的find找位置。

你可能感兴趣的:(DS博客作业07--查找)