首页 > 试题广场 >

旧键盘打字(20)

[编程题]旧键盘打字(20)
  • 热度指数:14644 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。现在给出应该输入的一段文字、以及坏掉的那些键,打出的结果文字会是怎样?

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


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

输入

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;
    }
}
发表于 2018-01-29 19:51:51 回复(1)
#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;
}

编辑于 2018-01-25 00:14:38 回复(2)
#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个错误。代码应该是没问题的,但是给出的对应输出答案中却是有明显错误的,这是什么情况?
发表于 2016-02-15 22:59:45 回复(6)
用正则表达式,不写循环
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);
    }
}

编辑于 2017-11-22 15:53:50 回复(1)
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();
    }
}

编辑于 2017-12-02 19:01:23 回复(0)
#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;
}

编辑于 2017-08-10 16:36:33 回复(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;
} 

发表于 2017-07-29 16:02:22 回复(1)

在牛客网上能过,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);
        }    
    }
}
发表于 2017-07-15 16:39:29 回复(3)
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();
	} 
}

发表于 2017-01-15 20:06:11 回复(0)
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]);
                }
            }
             
        }
    }
 
}
编辑于 2016-09-22 10:36:38 回复(0)
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;
	}
}

发表于 2016-06-11 18:34:14 回复(0)
#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++);
    }
}

编辑于 2018-01-29 21:36:47 回复(0)
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);
		}
	}

}


发表于 2015-09-22 14:03:00 回复(0)
#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;
}

发表于 2019-04-28 07:51:46 回复(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
编辑于 2018-09-22 11:44:53 回复(0)
尽量短的c代码:
#include<bits/stdc++.h>
#define maxn 100001
using namespace std;
int main(){
    char a[maxn],b[maxn];
    int hao[128]={0},i;
    scanf("%s%s",&a,&b);
    for(i=0;i<strlen(a);hao[toupper(a[i])]=1,hao[tolower(a[i++])]=1);
    if(hao[43]==1){for(int i='A';i<='Z';i++)hao[i]=1;}    
    for(i=0;i<strlen(b);(hao[b[i]]==0)?putchar(b[i++]):i++);
}

发表于 2018-06-17 11:05:05 回复(0)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    char no[100000],no1[100000];
    int i,j,s,t,m=0,n,a[100000]={0};
    scanf("%s",no);
    scanf("%s",no1);
    s=strlen(no);
    t=strlen(no1);
    for(i=0;i<s;i++)
    {
        if(no[i]=='+')
        m=1;
        a[no[i]-' ']=1;
    }
    for(i=0;i<t;i++)
    {
        if(m==0)
        {
            if(no1[i]>='a'&&no1[i]<='z')
            {
                if(a[(no1[i]-32)-' ']==0)
                    printf("%c",no1[i]);
            }
            else if(no1[i]=='_'||no1[i]==','||no1[i]=='.'||no1[i]=='-')
            {

                if(a[no1[i]-' ']==0)
                    printf("%c",no1[i]);
                    }
                    else
                    {
                        if(a[no1[i]-' ']==0)
                            printf("%c",no1[i]);
                    }
        }
        else
        {
            if(no1[i]>='a'&&no1[i]<='z')
            {
                if(a[(no1[i]-32)-' ']==0)
                    printf("%c",no1[i]);
            }
            else if(no1[i]=='_'||no1[i]==','||no1[i]=='.'||no1[i]=='-')
                {
                    if(a[no1[i]-' ']==0)
                        printf("%c",no1[i]);
                }
                else if(no1[i]<'A'||no1[i]>'Z')
                    {
                        if(a[no1[i]-' ']==0)
                            printf("%c",no1[i]);
                    }
        }
    }
    return 0;
}
 
发表于 2018-06-10 11:20:53 回复(0)
直接用cin或scanf的话pat上会卡第二个2测试点,注意第一个输入可能是空行,所以用getline(cin,s)
void n1033(){
    bool c[128]={false};
    string s,ss,ans;
    //cin>>s>>ss;
    getline(cin,s);
    getline(cin,ss);
    for(int i=0;i<s.length();i++){
        c[s[i]]=true;
        if(s[i]=='+')for(int i='A';i<='Z';i++)c[i]=true;
        else if(s[i]>='a'&&s[i]<='z')c[s[i]-32]=true;
        else if(s[i]>='A'&&s[i]<='Z')c[s[i]+32]=true;
    }
    for(int i=0;i<ss.length();i++){
        if(c[ss[i]])continue;
        ans+=ss[i];
    }
    if(ans.length())cout<<ans;
    else cout<<"\n";
}

发表于 2018-03-08 23:38:03 回复(1)
#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;
}

发表于 2018-02-04 20:38:07 回复(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);
	} 
}


发表于 2017-08-26 23:07:34 回复(0)