/*
*时间: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;
}