PAT 乙级 1014-程序员宅基地

技术标签: c++  PAT乙级刷题记录  

菜鸡的C/C++复健之路——PAT刷题篇

–此贴只是个人刷PAT的记录与总结,不用做任何商业用途,转载请告知–

PAT 乙级 1014福尔摩斯的约会

大侦探福尔摩斯接到一张奇怪的字条:我们约会吧! 3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hyscvnm。大侦探很快就明白了,字条上奇怪的乱码实际上就是约会的时间星期四 14:04,因为前面两字符串中第 1 对相同的大写英文字母(大小写有区分)是第 4 个字母 D,代表星期四;第 2 对相同的字符是 E ,那是第 5 个英文字母,代表一天里的第 14 个钟头(于是一天的 0 点到 23 点由数字 0 到 9、以及大写字母 AN 表示);后面两字符串第 1 对相同的英文字母 s 出现在第 4 个位置(从 0 开始计数)上,代表第 4 分钟。现给定两对字符串,请帮助福尔摩斯解码得到约会的时间。

输入格式:
输入在 4 行中分别给出 4 个非空、不包含空格、且长度不超过 60 的字符串。

输出格式:
在一行中输出约会的时间,格式为 DAY HH:MM,其中 DAY 是某星期的 3 字符缩写,即 MON 表示星期一,TUE 表示星期二,WED 表示星期三,THU 表示星期四,FRI 表示星期五,SAT 表示星期六,SUN 表示星期日。题目输入保证每个测试存在唯一解。

输入样例:          输出样例:
3485djDkxh4hhGE       THU 14:04
2984akDfkkkkggEdsb
s&hgsfdk
d&Hyscvnm

思路:

利用ASCII码进行字符的比较,对两个字符串进行循环比较,利用空的容器re去存储比较结果。

int main() {
    
	string m,n,m1,n1,re;
	cin >> m >> n >> m1 >> n1;
	char temp;
	int i, j, ln, lm;
	if (m.size() > n.size()) {
    
		re = m; m = n; n = re;
		re.clear();
	}
	//有这一步是因为双循环的外层循环是以字符串长度小的一方为参考写的,如果换做大的为参考会报错。
	lm = m.size();
	ln = n.size();
	int flag = lm;
	for (i = 0; i<lm; ++i) {
    
		temp = m[i];
		for (j = 0; j < ln; ++j){
    
		//等同于if (temp == n[j] && temp >= 'A' && temp <= 'G' && re.size() < 1)
			if (temp == n[j] && temp >= 65 && temp <= 90 && re.size() < 1){
    
				re.push_back(temp); 
				flag = j;//此处将flag赋值用以进入下面的循环
				break; 
			}//已经得到第一个相同的大写字母了,要跳出这层循环
		}
		for (;(ln--)!=flag && i>flag;){
    //从第一个相同字母之后的位置开始下一个循环比较
			if (temp == n[flag+1])
				re.push_back(temp);
			++flag;
		}
	}

进行的第三和第四个字符串比较时,发现题目中“后面两字符串第 1 对相同的英文字母 s 出现在第 4 个位置”也就是说两个字符串不论长短,只要对比相同位置是否一致就可。类比第一和第二这两个字符串,似乎也符合。。。。。(题目如果只说找到相同元素,就不能只考虑对比相同位置)既然这样就可以将第一部分简化。

for (int i = 0, flag = 0; i < m.size(); ++i) {
    
		if (!flag && m[i] == n[i] && m[i] >= 65 && m[i] <= 90 ){
    
			re.push_back(m[i]);
			flag = 1;  //此处i可能还会是0,故不能写成flag = i;
		}
		else if (flag && m[i]== n[i])
			re.push_back(m[i]);
	}

同样的思路,写出第二部分:

for (int t = 0; t < m1.size(); ++t){
    
		if (m1[t] == n1[t]) {
    
			if ((m1[t] >= 97 && m1[t] <= 122) || (m1[t] >= 65 && m1[t] <= 90))
				re.push_back(t+'0');//将int->char
		}
	}

第三部分是按题目要求输出,这一部分将re中的元素按个数出并处理为题目要求形式。

	int temp;
	if (re[1] >= 65)
		temp = (int)(re[1] - 'A') + 10;
	else
		temp = (int)re[1];

	if ((re[2] - '0') < 9)
		cout << A[re[0] - 'A'] << ' ' << temp << ':' << 0 << re[2];
	else
		cout << A[re[0] - 'A'] << ' ' << temp << ':' << re[2];
	return 0;
}

其实因为C++引入了输入流、输出流可以不另外用一个空容器去储存待输出数据,而是直接将待输出数据推入输出流即可。改变化简后的完整代码:

int main() {
    
	string m, n, ml, nl;
	string A[] = {
     "MON","TUE","WED","THU","FRI","SAT","SUN" };
	cin >> m >> n >> ml >> nl;

	int flag = 0;
	for (int i = 0; i < m.size(); ++i){
    
		if (!flag && m[i] == n[i] && m[i] >= 'A' && m[i] <= 'G'){
    
			cout << A[m[i] - 'A'] << ' ';
			flag = 1;
		}
		else if (flag && m[i] == n[i]){
    
			if (m[i] >= 'A' && m[i] <= 'N'){
    
				cout << m[i] - 'A' + 10 << ':';
				break;//此处防止将第三个、第四个....相同的元素输出
			}
			else if (m[i] >= '0' && m[i] <= '9'){
    
				cout << '0' << m[i] << ':';//根据题目要求单数值要补0
				break;
			}
		}
	}

	for (int t = 0; t < ml.size(); ++t){
    
		if (ml[t] == nl[t]){
    
			if ((ml[t] >= 'a' && ml[t] <= 'z') || (ml[t] >= 'A' && ml[t] <= 'Z')){
    
				if (t < 10)
					cout << '0' << t;//根据题目要求单数值要补0
				else
					cout << t;
			}
		}
	}
	return 0;
}

总结此题需要避免的几个坑:
1.第一个相同字符必须是大写字母,且必须在’A’ ~ ‘G’ 之间。(如果是A~Z,就有部分错误过不去)
2.第二个相同字符必须在’A’ ~ ‘N’ 或 ‘0’ ~ '9’之间 (道理同上)
3.第三个相同字符必须是字母。

值得学习的方法:
1. temp >= 65 && temp <= 90 直接写成 temp >= 'A' && temp <= 'G'
2. 用输出流去输出一串数据,省去存储待输出数据的容器。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Tangent180/article/details/113368376

智能推荐

http隧道 java_使用java语言实现http隧道技术-程序员宅基地

文章浏览阅读119次。该楼层疑似违规已被系统折叠隐藏此楼查看此楼/***Getaparametervalue**@paramkeyString*@paramdefString*@returnString*/publicStringgetParameter(Stringkey,Stringdef){returnisStandalone?System.getProperty(ke..._java http隧道

Keepalived高可用+邮件告警_keepalived sendmail-程序员宅基地

文章浏览阅读913次。IP主机名备注192.168.117.14keepalived-master主节点192.168.117.15keepalived-slaver备节点192.168.117.100VIP1.主备节点均安装keepalived# yum install -y keepalived httpd2.主备节点均修改keepalived日志存放路径..._keepalived sendmail

SPFILE 错误导致数据库无法启动(ORA-01565)_ora01565 ora27046-程序员宅基地

文章浏览阅读469次。--==========================================--SPFILE错误导致数据库无法启动(ORA-01565)--========================================== SPFILE错误导致数据库无法启动 SQL> startup ORA-01078: failurein proce_ora01565 ora27046

功能测试基础知识(1)-程序员宅基地

文章浏览阅读6.1k次,点赞2次,收藏54次。功能测试基础知识总结_功能测试

postgresql 中文排序_pg中文排序-程序员宅基地

文章浏览阅读3.2k次,点赞3次,收藏2次。pg 中文首字母排序_pg中文排序

[Mysql] CONVERT函数_mysql convert-程序员宅基地

文章浏览阅读3.1w次,点赞23次,收藏109次。本文主要讲解CONVERT函数_mysql convert

随便推点

HTML5与微信开发(2)-视频播放事件及API属性_微信开发者工具视频快进-程序员宅基地

文章浏览阅读8.6k次,点赞2次,收藏2次。HTML5 的视频播放事件想必大家已经期待很久了吧,在HTML4.1、4.0之前我们如果在网页上播放视频无外乎两种方法: 第一种:安装FLASH插件或者微软发布的插件 第二种:在本地安装播放器,在线播放组件之类的 因为并不是所有的浏览器都安装了FLASH插件,就算安装也不一定所有的都能安装成功。像苹果系统就是默认禁用FLASH的,安卓虽然一开始的时候支持FLASH,但是在安卓4.0以后也开始不_微信开发者工具视频快进

JedisConnectionException Connection Reset_jedisconnectionexception: java.net.socketexception-程序员宅基地

文章浏览阅读5.4k次,点赞3次,收藏4次。在使用redis的过程常见错误总结1.JedisConnectionException Connection Reset参考这边文章:Connection reset原因分析和解决方案https://blog.csdn.net/cwclw/article/details/527971311.1问题描述Exception in thread "main" redis.clients...._jedisconnectionexception: java.net.socketexception: connection reset

Lua5.3版GC机制理解_lua5.3 gc-程序员宅基地

文章浏览阅读8.3k次,点赞8次,收藏42次。目录1.Lua垃圾回收算法原理简述2.Lua垃圾回收中的三种颜色3.Lua垃圾回收详细过程4.步骤源码详解4.1新建对象阶段4.2触发条件4.3 GC函数状态机4.4标记阶段4.5清除阶段5.总结参考资料lua垃圾回收(Garbage Collect)是lua中一个比较重要的部分。由于lua源码版本变迁,目前大多数有关这个方面的文章都还是基于lua5.1版本,有一定的滞后性。因此本文通过参考当前..._lua5.3 gc

手机能打开的表白代码_能远程打开,各种手机电脑进行监控操作,最新黑科技...-程序员宅基地

文章浏览阅读511次。最近家中的潮人,老妈闲着没事干,开始学玩电脑,引起他的各种好奇心。如看看新闻,上上微信或做做其他的事情。但意料之中的是电脑上会莫名出现各种问题?不翼而飞的图标?照片又不见了?文件被删了,卡机或者黑屏,无声音了,等等问题。常常让她束手无策,求助于我,可惜在电话中说不清,往往只能苦等我回家后才能解决,那种开心乐趣一下子消失了。想想,这样也不是办法啊, 于是,我潜心寻找了两款优秀的远程控制软件。两款软件...

成功Ubuntu18.04 ROS melodic安装Cartograhper+Ceres1.13.0,以及错误总结_ros18.04 安装ca-程序员宅基地

文章浏览阅读1.8k次。二.初始化工作空间三.设置下载地址四.下载功能包此处可能会报错,请看:rosdep update遇到ERROR: error loading sources list: The read operation timed out问题_DD᭄ꦿng的博客-程序员宅基地接下来一次安装所有功能包,注意对应ROS版本 五.编译功能包isolated:单独编译各个功能包,每个功能包之间不产生依赖。编译过程时间比较长,可能需要几分钟时间。此处可能会报错:缺少absl依赖包_ros18.04 安装ca

Harbor2.2.1配置(trivy扫描器、镜像签名)_init error: db error: failed to download vulnerabi-程序员宅基地

文章浏览阅读4.1k次,点赞3次,收藏7次。Haobor2.2.1配置(trivy扫描器、镜像签名)docker-compose下载https://github.com/docker/compose/releases安装cp docker-compose /usr/local/binchmod +x /usr/local/bin/docker-composeharbor下载https://github.com/goharbor/harbor/releases解压tar xf xxx.tgx配置harbor根下建立:mkd_init error: db error: failed to download vulnerability db: database download

推荐文章

热门文章

相关标签