本文主要是介绍【PAT乙级1033】——旧键盘打字,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
思路:
err
串用于存放坏键,input
串存放待输入串;
遍历err串,在遍历一个err
串时,同时遍历input
串,看是input
串是否含有err
串的字符,如果有则用特殊字符替换(这里我使用'*'
替换),整个遍历完成后,遍历输出input
串,遇到'*'
就不输出!
看了解析后,解析思路:
利用string类型
的find()函数
,只需遍历input
串,如果input[i]
在err
串中,则不输出,否则输出;
代码如下,两个思想都写在了里面,注释了解析思路,提交使用g++
#include<bits/stdc++.h>
using namespace std;int main()
{string err, input;int lenErr, lenInput;int count = 0;getline(cin, err);getline(cin, input);lenErr = err.length();lenInput = input.length();/*解析思路*/
// for(int i=0; i<lenInput; i++)
// {
// if(err.find(toupper(input[i]))!=string::npos) continue;
// if(isupper(input[i])&&err.find('+')!=string::npos) continue;
// printf("%c", input[i]);
// }/*自己的思路*/for(int i=0; i<lenErr; i++){for(int j=0; j<lenInput; j++){if((err[i]=='_'||err[i]==','||err[i]=='.'||err[i]=='-'||isdigit(err[i]))&&err[i]==input[j]){input[j] = '*';}if(err[i]==toupper(input[j])){input[j] = '*';} if(err[i]=='+'&&isupper(input[j])){ input[j] = '*'; } } } //这两个 for 循环加下面控制输出代码,等价最上面注释的一个 for 循环 count=0;for(int i=0; i<lenInput; i++){if(input[i]=='*')count++;}if(count==lenInput)printf("\n");else{for(int i=0; i<lenInput; i++){if(input[i]!='*')printf("%c", input[i]); }}return 0;
}
【Debug过程】:自己的逻辑没有问题,问题出在输入上,以后记住:如果题目输入多行string,最好用getline( cin, string);
【补漏】:string类find()与 string::npos的用法,find不仅可以判断单个字符,也可以判断字符串是否为比较字符的子串,同时还可以设定判断起始位置!另外字符串可以直接比较,比较规则为【字典序】,像Q1028人口普查题,判断出生年月日是否在规定范围内,直接>=和<=比较即可;
【补漏】:ctype库中好用的函数有:is系列(isalnum, isalpha, islower, isupper, isdigit); to系列(toupper, tolower)
ctype文件包含库函数简单明了版:
https://blog.csdn.net/zhouhongkai06/article/details/79050856
这篇关于【PAT乙级1033】——旧键盘打字的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!