输入在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); } }