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

智能推荐

【信贷风控30分钟精通39】风控策略体系搭建2-程序员宅基地

文章浏览阅读938次,点赞23次,收藏21次。反欺诈策略是为防范恶意客户采取欺诈行为谋取利益而制订的策略,目的是通过对欺诈行为的识别,遏制欺诈风险,为金融机构止损。根据欺诈的不同维度,欺诈的分类目前,应对欺诈风险的有效措施包括反欺诈规则和反欺诈模型。

yum安装及配置_安装yum-程序员宅基地

文章浏览阅读10w+次,点赞40次,收藏332次。yum是用来管理rpm的,就跟maven管理jar包相似。yum源(库)分为本地库、网络库。首先要配置yum源,可支持多个源。先查看一下挂载情况:df -h这里我们要更换光盘,并挂载:mount /dev/cdrom /mnt(如果不能成功挂载,点击一下连接即可)之后再次使用 df -h命令,就能查看到光盘的内容。下面我们cd到 /mnt下查看一下:首先关注一下Pa..._安装yum

关于STM32 CAN的过滤器/滤波器_stm32can mailbox filter-程序员宅基地

文章浏览阅读3.8k次,点赞5次,收藏12次。1.在设置CanTxMsg.StdId时注意需要将其右移一位,比如如下滤波器配置:CAN_FilterInitStructure.CAN_FilterNumber=0;CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;CAN_FilterInitStructure.CAN_FilterScale=CAN_Filter..._stm32can mailbox filter

HDU 5119 Happy Matt Friends(动态规划)【状压基础类模板】_matt has n friends. they are playing a game togeth-程序员宅基地

文章浏览阅读373次。att has N friends. They are playing a game together. Each of Matt’s friends has a magic number. In the game, Matt selects some (could be zero) of his friends. If the xor (exclusive-or) sum of the selected friends’magic numbers is no less than M , Matt wi_matt has n friends. they are playing a game together.

vue3+vite+ts项目配置开发环境和生产环境 打包命令配置_vite打包配置-程序员宅基地

文章浏览阅读8.4k次,点赞6次,收藏29次。开发环境和生产环境的配置和打包方式有所不同,下面是基于vue3+vite+ts项目的开发环境和生产环境配置及打包方式的详细说明。打包完成后会在项目根目录下生成dist目录,里面包含了打包后的静态文件和index.html文件,可以直接部署到服务器上。这里配置了三个命令,分别是开发环境启动命令、开发环境打包命令和生产环境打包命令。1.3 配置.env.development。2.2 配置.env.production。1.2 配置vite.config.ts。2.1 配置vite.config.ts。_vite打包配置

(最新最详细)安装ubuntu18.04-程序员宅基地

文章浏览阅读2w次,点赞4次,收藏91次。目录1. window10中下载ubuntu镜像2. 制作U盘启动盘3. Ubuntu 分配硬盘空间1. window10中下载ubuntu镜像下载地址2. 制作U盘启动盘安装制作工具:UltraISO(点我下载),下载完成后安装插入用来做启动盘的U盘(最好是usb3.0接口,16GB或以上),并清空里面的文件打开安装好的UltraISO,点击继续试用按钮工作界面进入工作界面后,点击菜单栏文件(F),在弹出的选项卡里点击打开在弹出的文件选择对话框中找到下载好的 Ubuntu18.04._ubuntu18.04

随便推点

Linux 文件系统 EXT4 的前世今生-程序员宅基地

文章浏览阅读161次。在先前关于Linux文件系统的文章中,我写了一份说明书去介绍Linux文件系统,里面有一些高级的概念,比如说,一切都是文件。我很想去深入地讨论更多EXT文件系统的特性的信息。所以,首先让我们来回答这个问题:什么是文件系统?一个文件系统应该遵循以下特点: 1.数据存储:文件系统主要的功能是结构化存储和取回数据。 2.命名空间:提供一套命名和组织的方法,就是命名和结构化数据的规则。 3.安全模型:一种访问控制的策略。 4.API:系统操控文件系统对象的函数,就像操作文件夹...

别人家的公司:微软为员工发1500美元疫情奖金-程序员宅基地

文章浏览阅读308次。西雅图IT圈:seattleit【今日作者】Dexter读书巨慢理事会会长别人家的公司什么样?坐拥巨额现金流的微软,一言不合就发钱。01昨天微软首席人事官凯瑟琳霍根宣布——将向微软全球员工..._微软 西雅图 年底奖金

Ik分词器配置远程扩展字典_ik analyzer 扩展词典配置远程词典 可实时编辑-程序员宅基地

文章浏览阅读2k次。通过配置远程扩展词典,可以读取远程词典,当改变远程词典时,不必重启服务器,elasticsearch会自动加载并进行分词。步骤:配置文件服务器,把远程扩展词典放到服务器下。修改elasticsearch目录下plugins\ik\config\IKAnalyzer.cfg.xml文件并保存,如下: <properties> <comment>IK A..._ik analyzer 扩展词典配置远程词典 可实时编辑

分布式系列教程(11) -分布式协调工具Zookeeper(分布式锁实现)_分布式锁 的具体实现工具-程序员宅基地

文章浏览阅读553次,点赞2次,收藏2次。代码已提交至Github,有兴趣的同学可以下载来看看(git版本号:bea4d6f7ec9f7309033bcfa43316a660171ae5b6):https://github.com/ylw-github/Zookeeper-Demo本文目录结构:l____1. 知识点回顾l________1.1 多线程l________1.2 Java共享内存模型l____2. 分布式锁的解决方..._分布式锁 的具体实现工具

Nginx网站服务详解(Nginx服务的主配置文件 ——nginx.conf)-程序员宅基地

文章浏览阅读9.3k次,点赞9次,收藏51次。Nginx网站服务详解,Nginx服务的主配置文件,修改,监听,配置,密码认证,以及IP和端口虚拟主机配置方法,含图文步骤拆解讲解_nginx.conf

推荐文章

热门文章

相关标签