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找位置。
原文地址:https://www.cnblogs.com/zyxaa/p/11032185.html