输入在2行中分别给出坏掉的那些键、以及应该输入的文字。其中对应英文字母的坏键以大写给出;每段文字是不超过10^5个字符的串。可用的字符包括字母[a-z, A-Z]、数字0-9、以及下划线“_”(代表空格)、“,”、“.”、“-”、“+”(代表上档键)。题目保证第2行输入的文字串非空。 注意:如果上档键坏掉了,那么大写的英文字母无法被打出。
在一行中输出能够被打出的结果文字。如果没有一个字符能被打出,则输出空行。
7+IE. 7_This_is_a_test.
_hs_s_a_tst
import java.util.Scanner;
/**
* 旧键盘打字
* 题目描述
* 旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。现在给出应该输入的一段文字、
* 以及坏掉的那些键,打出的结果文字会是怎样?
* 输入描述:
* 输入在2行中分别给出坏掉的那些键、以及应该输入的文字。其中对应英文字母的坏键以大写给出;每段
* 文字是不超过10^5个字符的串。可用的字符包括字母[a-z, A-Z]、数字0-9、以及下划线“_”(代表
* 空格)、“,”、“.”、“-”、“+”(代表上档键)。题目保证第2行输入的文字串非空。
* 注意:如果上档键坏掉了,那么大写的英文字母无法被打出。
* 输出描述:
* 在一行中输出能够被打出的结果文字。如果没有一个字符能被打出,则输出空行。
* 输入例子:
* 7+IE.
* 7_This_is_a_test.
* 输出例子:
* _hs_s_a_tst
*
* @author shijiacheng
* @date 2018/1/29
*/
public class B1023TypeInOldKeyboard {
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
String brokenStr = sc.next();
String oldStr = sc.next();
StringBuilder sb = new StringBuilder();
int count = 0;
for (int i = 0; i < oldStr.length(); i++) {
if (canShow(brokenStr, oldStr.charAt(i))) {
char ch= oldStr.charAt(i);
sb.append(ch);
count++;
}
}
if (count == 0){
System.out.println();
}
else{
System.out.print(sb.toString());
}
}
public static boolean canShow(String brokenStr, char ch) {
if (brokenStr.indexOf(Character.toUpperCase(ch)) >= 0 || brokenStr.indexOf(Character.toLowerCase(ch)) >= 0) {
return false;
}
if (brokenStr.indexOf('+') >= 0 && ch - 'A' >= 0 && ch - 'A' <= 25) {
return false;
}
return true;
}
}
#include <cstring>
#include <iostream>
using namespace std;
char x[100010],y[100010];
int main(){
int hash[128]={0}; //ASCII码128位
gets(x); //用cin或者scanf无法识别回车换行符,即无法通过没有坏键的情况,要用gets
cin>>y;
int len1=strlen(x);
int len2=strlen(y);
for(int i=0;i<len1;i++){
if(x[i]>='A'&x[i]<='Z'){
hash[x[i]]=1;
hash[x[i]-'A'+'a']=1; //把该字母大小写一并禁掉
}
else if(x[i]=='+'){
for(int j='A';j<='Z';j++) //禁掉所有大写字母
hash[j]=1;
}
else hash[x[i]]=1;
}
for(int i=0;i<len2;i++){
if(hash[y[i]]==0)
cout<<y[i];
}
cout<<'\n'; //就算没有一个字符能输出,也能通过换行输出空行
return 0;
}
#include<stdio.h>
#include<string.h>
int main()
{
long n,i,j,l1,l2,c[100010]={0},flag=0;
char a[100010],str[100010];
gets(a);
l1=strlen(a);
gets(str);
l2=strlen(str);
for(i=0;i<l1;i++)
{
if(a[i]=='+')
{
flag=1;
for(j=0;j<l2;j++)
{
if(str[j]>='A'&&str[j]<='Z')
{
c[j]=1;
}
}
}
}
for(j=0;j<l2;j++)
{
for(i=0;i<l1;i++)
{
if(str[j]==a[i]||(str[j]-32)==a[i])
c[j]=1;
}
}
for(j=0;j<l2;j++)
{
if(c[j]==0)
printf("%c",str[j]);
}
printf("\n");
return 0;
}
10个测试点中前7个正确,后3个错误。代码应该是没问题的,但是给出的对应输出答案中却是有明显错误的,这是什么情况?
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
String badKeys = bufferedReader.readLine();
String text = bufferedReader.readLine();
if(badKeys.indexOf('+') != -1) {
text = text.replaceAll("[A-Z]", "");
}
if(badKeys.indexOf('-') != -1) {
text = text.replaceAll("[-]", "");
badKeys = badKeys.replaceAll("[-]", "");
}
final String regexBadKeys = "[" + badKeys + "]|[" + badKeys.toLowerCase() + "]";
text = text.replaceAll(regexBadKeys, "");
System.out.println(text);
}
}
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
char[] brokenkey = input.readLine().toCharArray();
Set set = new HashSet();
for (int i = 0; i != brokenkey.length; i++) {
set.add(brokenkey[i]);
}
char[] initialoutput = input.readLine().toCharArray();
boolean taggle = set.contains('+');
for (int i = 0; i != initialoutput.length; i++) {
if (set.contains(Character.toUpperCase(initialoutput[i])))
continue;
else if (taggle && Character.isUpperCase(initialoutput[i]))
continue;
else
System.out.print(initialoutput[i]);
}
input.close();
}
} #include<iostream>
#include<string>
using namespace std;
bool isBigLetter(char c)
{
if(c>='A'&&c<='Z')
return true;
return false;
}
bool isSmallLetter(char c)
{
if(c>='a'&&c<='z')
return true;
return false;
}
int main()
{
int a[128]={0};
string s1,s2;
cin>>s1>>s2;
bool isBig=false;
for(int i=0;i<s1.size();i++)
{
a[s1[i]]++;
if(s1[i]=='+')
isBig=true;
}
for(int i=0;i<s2.size();i++)
{
if(isBig)
{
if(isBigLetter(s2[i]))
continue;
}
if(isSmallLetter(s2[i]))
{
if(a[s2[i]-32])
continue;
}
if(a[s2[i]])
continue;
cout<<s2[i];
}
cout<<endl;
return 0;
} #include <cstdio>
#include <cstring>
#include <string>
#include <cstdlib>
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
char s[100100],s1[100010];
int c[123]= {0};
int main()
{
int i,j,len,len1,cnt=0;
scanf("%s %s",s,s1);
len=strlen(s);
len1=strlen(s1);
for(j=0; j<len; j++)
{
if('A'<=s[j]&&s[j]<='Z')
c[s[j]+'a'-'A']++,c[s[j]]++;//大写与小写都标记加1
else
c[s[j]]++;
if(s[j]=='+')
cnt=1;
}
j=0;
for(i=0; i<len1; i++)
{
if('A'<=s1[i]&&s1[i]<='Z')
{
if(cnt==1)
s1[i]='*',j++;//将所有不符合的字符特殊化
else if(c[s1[i]]!=0||c[s1[i]+'a'-'A']!=0)//避免特殊字符也被标记
s1[i]='*',j++;
}
else if(c[s1[i]]!=0)
s1[i]='*',j++;
else if(j==len1)
{
printf("_");
break;
}
}
for(i=0; i<len1; i++)
if(s1[i]!='*')
printf("%c",s1[i]);
return 0;
} 在牛客网上能过,PAT最后一组测试点运行超时,可代码只是遍历了一遍字符串的复杂度,求大神解答,感激不尽。
#include <cstdio>
#include <cstring>
int down[256];
char s1[100];
char s2[100010];
int main(){
gets(s1);
gets(s2);
for(int i=0; i<strlen(s1); i++){
int tmp = s1[i];
down[tmp] = 1;
if(tmp>='A' && tmp<='Z')
down[tmp+32]=1;
}
for(int i=0; i<strlen(s2); i++){
char ch = s2[i];
int tmp = ch;
if(down[tmp]!=1){
if((down['+']==1) && (ch>='A'&&ch<='Z'))
continue;
else
printf("%c",ch);
}
}
}
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
char[] a=in.next().toLowerCase().toCharArray();
char[] b=in.next().toCharArray();
boolean[] hash=new boolean[b.length];
for(int i=0;i<a.length;i++){
if(a[i] == '+'){
for(int j=0;j<b.length;j++){
if(Character.isUpperCase(b[j]))
has敏感词rue;
}
}else{
for(int j=0;j<b.length;j++){
if(has敏感词rue)
continue;
if(Character.toLowerCase(b[j])==a[i])
has敏感词rue;
}
}
}
boolean flag=false;
for(int i=0;i<b.length;i++){
if(hash[i]==false){
flag=true;
System.out.print(b[i]);
}
}
if(!flag)
System.out.println();
}
}
importjava.util.ArrayList;importjava.util.List;importjava.util.Scanner;publicclassMain {publicstaticvoidmain(String[] args){List list = newArrayList();Scanner in = newScanner(System.in);char[] bad = in.nextLine().toCharArray();char[] fact = in.nextLine().toCharArray();booleanupCheck = true;//默认 + 号没有坏for(inti = 0; i < bad.length; i++){if(!list.contains(bad[i])){list.add(bad[i]);if('Z'-bad[i] <=26&& 'Z'-bad[i] >=0)list.add((char)((int)bad[i]+32));}}if(list.contains('+')) upCheck = false;for(inti = 0; i < fact.length; i++){if(upCheck){if(!list.contains(fact[i])){System.out.print(fact[i]);}}else{if(!list.contains(fact[i]) && !('Z'-fact[i] <=26&& 'Z'-fact[i] >=0)){System.out.print(fact[i]);}}}}}
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String key = in.next();
String text = in.next();
int[] a = new int[26+10+1+4];//26字母10个数字,1个空格,(+ , - . (43~46))
for(int i = 0;i<key.length();i++){
int index = index(key.charAt(i));
if(index>=0)
a[index] = 1;
}
for(int i = 0;i<text.length();i++){
char c = text.charAt(i);
int index = index(c);
if(a[index]!=0)
continue;
else if(c>='A'&&c<='Z'&&a[index('+')]!=0)
continue;
System.out.print(c);//说明这个键是好的
}
}
private static int index(char c){
if(c=='_')
return 0;
if(c>='a'&&c<='z')
return c-'a'+1;
if(c>='A'&&c<='Z')
return c-'A'+1;
if(c>='0'&&c<='9')
return 26+c-'0'+1;
if(c>=43&&c<=46)
return 26+10+1+c-43;
return -1;
}
}
#include<stdio.h>
#include<string.h>
#include<ctype.h>
int main (){//the shorter,the better.
int i,l,h[128];char o[100000],b[128];
for(;~scanf("%s%s",b,o);printf("\n")){
for(l=strlen(b),memset(h,0,sizeof(h)),i=0;i<l;h[toupper(b[i])]=h[tolower(b[i])]=1,i++);
for (l=strlen(o),i=0;i<l;h[o[i]]||(h[43]&&isupper(o[i]))?:printf("%c",o[i]),i++);
}
}
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Scanner sc=new Scanner(System.in);
String str1=sc.next();
String str2=sc.next();
//boolean isShift=true;
if(str1.indexOf('+')!=-1){
//isShift=false;
str2=str2.replaceAll("[A-Z]","");
str1=str1.replaceAll("\\+","");
}
//System.out.println(str1+" "+str2);
char[] arrc=str1.toCharArray();
for(int i=0;i<arrc.length;i++){
char c=arrc[i];
String temp=Character.toString(c);
if(temp.equals(".")){
temp="\\.";
}else{
String temp1=temp.toLowerCase();
str2=str2.replaceAll(temp1, "");
}
//System.out.println(temp);
str2=str2.replaceAll(temp, "");
//System.out.println(str2);
}
if(str2.equals("")){
System.out.print(" ");
}else{
System.out.print(str2);
}
}
}
#include <bits/stdc++.h>
using namespace std;
unordered_map<char, bool> mp;
int main(){
ios::sync_with_stdio(false);
string invalid,s;
getline(cin,invalid);//防空行,全好时
cin>>s;
for(auto c : invalid){
if(isupper(c)) mp[c+32] = true;
else mp[c] = true;
}
for(auto c : s){
if(isupper(c)&&!mp['+']&&!mp[c+32]) cout<<c;
else if(!isupper(c)&&!mp[c]) cout<<c;
}
cout<<endl;
return 0;
} Python加油!!使用replace()函数,返回替代后的字符串
while True:
try:
badKey = input()
stringsInput = input()
result = stringsInput
for i in badKey:
if badKey.isupper(): #如果坏键是大写字母,则执行一次小写替换
result = result.replace(i.lower(),"")
result = result.replace(i, "") #坏键字符都执行一次替换
if badKey.find('+') > -1: #如果含有上档键
for i in set(list(result)): #则把上面替换后剩下的字符串转换成集合进行查找替换
if i.isupper(): #找到大写则替换
result = result.replace(i, "")
print(result)
except Exception:
break
#include <cstdio>
#include <cstring>
bool hashmap[128] = {0};
int main(void){
char str[100005];
gets(str);
int len1 = strlen(str);
for(int i = 0; i < len1; i++){
if(str[i] >= 'A' && str[i] <= 'Z'){
str[i] += 32;
}
hashmap[str[i]] = 1;
}
gets(str);
int len2 = strlen(str);
for(int j = 0; j < len2; j++){
if(str[j] >= 'A' && str[j] <= 'Z'){
char lower = str[j] + 32;
if(hashmap[lower] == 0 && hashmap['+'] == 0){
printf("%c", str[j]);
}
}else{
if(hashmap[str[j]] == 0) printf("%c", str[j]);
}
}
return 0;
}
import java.util.Scanner;
/**
* 主要考虑replaceAll(regex, replacement);
* regex:是正则表达式,所以需要注意某些字符的转义。
* replacement:替换字符用""表示删除
* 题目中指出"+"代表“代表上档键”,并且注意:如果上档键坏掉了,那么大写的英文字母无法被打出。
* 所以当发现"+"时清楚所有的大写字符 rig = rig.replaceAll("[A-Z]","");
* @author MSK
*
*/
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String err = sc.next();
String rig = sc.next();
for(int i = 0; i < err.length(); i++){
String ee = err.substring(i, i+1);
char e = ee.charAt(0);
// System.out.println(ee+"******"+e);
if('A'<= e &&e <='Z'){
rig = rig.replaceAll(ee,"");
ee = ee.toLowerCase();
rig = rig.replaceAll(ee,"");
}else if(e == '+'){
rig = rig.replaceAll("[A-Z]","");
}else if(e == '.'){
rig = rig.replaceAll("//"+ee,"");
}else
rig = rig.replaceAll(ee,"");
// System.out.println(rig);
}
sc.close();
System.out.println(rig);
}
}