【PAT】B1033/B1038/B1029

22 篇文章 0 订阅
/*
*时间:2018年4月7日15:31:27-2018年4月7日16:15:54
*题号:1033. 旧键盘打字
*语言:C++ (g++ 4.7.2)
*分数:20
*题目描述:

旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。现在给出应该输入的一段文字
、以及坏掉的那些键,打出的结果文字会是怎样?

输入格式:

输入在2行中分别给出坏掉的那些键、以及应该输入的文字。其中对应英文字母的坏键以大写给出;每段文字
是不超过105个字符的串。可用的字符包括字母[a-z, A-Z]、数字0-9、以及下划线“_”(代表空格)、“,”、
“.”、“-”、“+”(代表上档键)。题目保证第2行输入的文字串非空。

注意:如果上档键坏掉了,那么大写的英文字母无法被打出。

输出格式:

在一行中输出能够被打出的结果文字。如果没有一个字符能被打出,则输出空行。
输入样例:

7+IE.
7_This_is_a_test.

输出样例:

_hs_s_a_tst

*/

#include <iostream>
using namespace std;
#include <stdio.h>
#include <string.h>
int main()
{	
	char hash[128];
	char str[100010];
	gets(hash);
	gets(str);
	int lenhash = strlen(hash);
	int lenstr = strlen(str);
	bool HashTable[128] = {false};    //记录坏键
	for (int i=0; i<lenhash; i++) //标记坏键
		HashTable[hash[i]] = true;
	for (int i=0; i<lenstr; i++)  //遍历str
	{
		if (HashTable['+'] == true)    //如果'+'键失效,则对所有的大写continue处理,表示不用输出这个字母
			if (str[i] >='A' && str[i] <= 'Z') continue;
		if (str[i] == '+') continue;
		bool trans = false;//标记是否进行了大小写转换
		if (str[i] >='a' && str[i] <= 'z') {trans = true; str[i] -= 32;}//小写转换成大写,并标记进行了大小写转换
		if (HashTable[str[i]] != true)
		{
			str[i] = trans? str[i]+32: str[i];//如果小写转换成了大写,那么变回小写再输出
			printf("%c", str[i]);
		}			
	}
	printf("\n");
	return 0;
}


/*
*这题开始用string的cin读进来,好像不能读空行,所以第三个点好像一直错误
*后来换成了gets来读,结果第三个点可以了,但是最后一个点出问题了,运行超时,看来gets的效率不行呀
*于是把cout都改成了printf还没有搞定,不知道还有哪儿可以简化的
*CSDN上一个建议把strlen的返回值改成int类型,果然改了之后最后一个点就通过了,以后记得最好长度的单独写出来用int 类型
*/




/*
*时间:2018年4月7日20:22:40-2018年4月7日20:33:44
*题号:1038. 统计同成绩学生
*语言:C++ (g++ 4.7.2)
*分数:20
*题目描述:

本题要求读入N名学生的成绩,将获得某一给定分数的学生人数输出。

输入格式:

输入在第1行给出不超过105的正整数N,即学生总人数。随后1行给出N名学生的百分制整数成绩,
中间以空格分隔。最后1行给出要查询的分数个数K(不超过N的正整数),随后是K个分数,中间以空格分隔。

输出格式:

在一行中按查询顺序给出得分等于指定分数的学生人数,中间以空格分隔,但行末不得有多余空格。
输入样例:

10
60 75 90 55 75 99 82 90 75 50
3 75 90 88

输出样例:

3 2 0
*/

#include <iostream>
using namespace std;

int main()
{
	int N, K;       //分数及查询的个数		
	int renshu[101] = {0}; //每种分数的人数,注意:最高分100分,数组下表要到101才行
	cin>>N;
	int score[N];
	for (int i=0; i<N; i++)
	{
		cin>>score[i];
		renshu[score[i]]++;
	}		
	cin>>K;
	int chaxun[K]; 
	for (int i=0; i<K; i++)
		cin>>chaxun[i];

	for (int i=0; i<K; i++)
	{
		if(i == K-1)   //如果是最后一个查询分数后面不输出空格
			cout<<renshu[chaxun[i]];
		else
			cout<<renshu[chaxun[i]]<<" ";
	}
	return 0;
}

/*
*时间:2018年4月7日12:44:35-2018年4月7日13:37:03
*题号:1029. 旧键盘
*语言:C++ (g++ 4.7.2)
*分数:20
*题目描述:

旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。现在给出应该输入的一段文字、
以及实际被输入的文字,请你列出肯定坏掉的那些键。

输入格式:

输入在2行中分别给出应该输入的文字、以及实际被输入的文字。每段文字是不超过80个字符的串,由字
母A-Z(包括大、小写)、数字0-9、以及下划线“_”(代表空格)组成。题目保证2个字符串均非空。

输出格式:

按照发现顺序,在一行中输出坏掉的键。其中英文字母只输出大写,每个坏键只输出一次。题目保证至少有
1个坏键。
输入样例:

7_This_is_a_test
_hs_s_a_es

输出样例:

7TI
*/

#include <iostream>
using namespace std;
#include <string.h>
#define Debug false
#include <stdio.h>

int main()
{	
	string str1, str2;
	cin>>str1>>str2;
	bool HashTable[128] = {false}; //坏键,包含了所有的ASCII码,true表示损坏,虽然这里只有数字字母和下划线
	
	for (int i=0; i<str1.size(); i++)//遍历str1
	{
		int j = 0;                   //J要在str1的循环里str2循环外建立
		for (j=0; j<str2.size(); j++)//遍历str2
		{
			if (str1[i] >= 'a' && str1[i] <= 'z') str1[i] -= 32;  //小写转换成大写
			if (str2[j] >= 'a' && str2[j] <= 'z') str2[j] -= 32;  //小写转换成大写
			if (str1[i] == str2[j]) break;						  //将str1[i]与str2中的所以元素对比,发现有相同就break
		}
		if (Debug) cout<<"str1[i]: \n"<<str1[i]<<"\nstr2[j]: \n"<<str2[j]<<endl;
		if ((j == str2.size()) && HashTable[str1[i]] == false)     //如果一直没有break,则判断是否有输出过这个键
		{
			cout<<str1[i];                    //没有输出过则输出这个键
			HashTable[str1[i]] = true;        //标记已经输出过这个键了,以后不用再输出了
			if (Debug) printf("str1[%d]= %d \n",i, str1[i]);
			if (Debug) printf("HashTable[%d]]= %d\n ",str1[i], HashTable[str1[i]]);
		}
		if (Debug) printf("HashTable[%d]]= %d\n ",str1[i], HashTable[str1[i]]);
	}		
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值