1032 Sharing (坑题,不难,测试点3、4、5分析,链表相关)

目录

题目

测试样例

输入样例1

输出样例1

输入样例2

输出样例2

提交结果截图

测试点分析

带详细注释的源代码


题目

 

题目链接:

1032 Sharing icon-default.png?t=L892https://pintia.cn/problem-sets/994805342720868352/problems/994805460652113920 

测试样例

输入样例1

11111 22222 9
67890 i 00002
00010 a 12345
00003 g -1
12345 D 67890
00002 n 00003
22222 B 23456
11111 L 00001
23456 e 67890
00001 o 00010

输出样例1

67890

输入样例2

00001 00002 4
00001 a 10001
10001 s -1
00002 a 10002
10002 t -1

输出样例2

-1

提交结果截图

测试点分析

测试点分析
测试点3输入的单词首地址可能是-1,要对这种情况进行处理
测试点4注意到题目中的地址值都是5位,所以输出的时候要注意补齐5位
测试点5题目意思表述问题,其实题目要我们求的是两个单词第一个重合的子段的首地址值,但我们理解起来可能是求两个单词的相同后缀的首地址值

带详细注释的源代码

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;

struct word //结构体存储字母结点数据
{
	char data;
	int next;
};

int main()
{
	int ad1, ad2, n, address, next;//ad1->第一个单词首字母地址,ad2->第二个单词首字母地址
	char data;
	vector<word>words_list(100000);//记录字母结点信息,因为地址是5位,所以数组要足够大
	vector<bool>flag(100000, false);//标记字母结点是否被访问过
	cin >> ad1 >> ad2 >> n;
	if (ad1 == -1 || ad2 == -1)//**测试点3**, 特殊情况->存在为空的单词
	{
		cout << "-1" << endl;
		return 0;
	}
	for (int i = 0; i < n; i++)//输入字母结点数据
	{
		cin >> address >> data >> next;
		words_list[address].data = data;
		words_list[address].next = next;
	}
	flag[ad1] = true;//标记第一个单词首字母访问过
	while (1)//遍历第一个单词所有字母并进行标记
	{
		if (words_list[ad1].next == -1)//到了单词结尾,退出
			break;
		ad1 = words_list[ad1].next;//得到下一个字母的地址
		flag[ad1] = true;//标记该字母访问过
	}

	if (flag[ad2])//如果首字母地址以及被访问过,即找到了第一个重合的字母结点
		printf("%05d\n", ad2);//**测试点4**,没注意要5位错误输出:cout <<ad2 << endl;
	else
		while (1)//遍历第一个单词所有字母并判断是否访问过
		{
			if (words_list[ad2].next == -1)//到了单词结尾,退出
			{
				cout << "-1" << endl;//说明没有发现重合的字母结点,输出-1
				break;
			}
			ad2 = words_list[ad2].next;//得到下一个字母的地址
			if (flag[ad2])//找到了第一个重合的字母结点
			{
				printf("%05d\n", ad2);//**测试点4**,没注意要5位错误输出:cout << ad2 << endl;
				break;
			}
		}
	return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值