首页 > 试题广场 >

旧键盘 (20)

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

输入描述:
输入在2行中分别给出应该输入的文字、以及实际被输入的文字。每段文字是不超过80个字符的串,由字母A-Z(包括大、小写)、数字0-9、
以及下划线“_”(代表空格)组成。题目保证2个字符串均非空。


输出描述:
按照发现顺序,在一行中输出坏掉的键。其中英文字母只输出大写,每个坏键只输出一次。题目保证至少有1个坏键。
示例1

输入

7_This_is_a_test<br/>_hs_s_a_es

输出

7TI
#include <iostream>
#include <string>
#include<cstdio>
using namespace std;

int main(void)
{
string a, b, c;
//char a[80], b[80], c[80];
int n = 0, i, j = 0, mark;
cin >> a >> b;

for (i = 0; i<a.size(); i++)
{
if ((a[i] == b[j]) && (j <b.size()))
{
j++;
continue;
}
else
{
mark = 0;
if (islower(a[i]))
a[i] = a[i] - 32;
for (int k = 0; k<n; k++)
if (a[i] == c[k])
mark = 1;
if (mark == 0)
c[n++] = a[i];
}
}
for (i = 0; i<n; i++)
cout << c[i];
return 0;
}
很诧异的一点是 VS2015上无法执行 但这个上面验证通过
发表于 2017-07-14 15:17:21 回复(0)
a, b = raw_input().upper(), raw_input().upper()
print ''.join(filter(lambda x: x not in b, sorted(set(a), key=a.index)))


发表于 2017-01-18 14:47:01 回复(0)

#include<iostream>
#include<ctype.h>
#include<string.h>
using namespace std;
//PAT乙级真题旧键盘 (20)
intmain()
{
    charInput[82],FactInput[82],WrongInput[82];
    cin>>Input>>FactInput;
    inti=0,j=0,m=0,n=0;
    intisExist;
    intlength = strlen(Input);
    intFactLength = strlen(FactInput);
    for(i=0;i<length;i++){
            //is the equal
            if((Input[i]==FactInput[j]) && (j<FactLength))
                j++;
            else{
                isExist = 0;
                //is the lower
                if(islower(Input[i]))
                    Input[i] = Input[i]-32;
                //is the WrongInput
                for(m=0;m<n;m++){
                    if(Input[i]==WrongInput[m])
                        isExist = 1;
                }
                //is not in the WrongInput
                if(isExist == 0)
                    WrongInput[n++]=Input[i];
            }
    }
    for(i=0;i<n;i++)
        cout<<WrongInput[i];
    return0;
}

发表于 2017-01-15 17:00:42 回复(0)
#include<iostream>
#include <string>
using namespace std;
int main()
{
	string a, b, c;
	int i = 0, j = 0;
	cin >> a >> b;
	c = ' ';
	while (i <= a.length())
	{
		if (a[i] == b[j])
		{
			i++;
			j++;
			continue;
		}
		else
		{
			char temp = a[i];			
			if (a[i] >= 'a'&&a[i] <= 'z')
				temp = char(a[i] - 32);
			if (c.find(temp)==-1)
			{
				cout << temp;
				c = c + temp;
			}
			i++;
		}
	}
	return 0;
}


发表于 2016-07-19 15:07:47 回复(1)
import java.util.Scanner;
public class Main {
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		String a = in.next();
		String b = in.next();
		StringBuilder sb = new StringBuilder();
		int i = 0,j = 0;
		int[] arr = new int[26+10+1];
		while(i<a.length()){
			if(j<b.length()){
				if(a.charAt(i)!=b.charAt(j)){
					int index = index(a.charAt(i));
					if(arr[index]++==0)
						sb.append(Character.toUpperCase(a.charAt(i)));
				}else{
					j++;
				}
			}else{
				int index = index(a.charAt(i));
				if(arr[index]++==0)
					sb.append(Character.toUpperCase(a.charAt(i)));
			}
			i++;
		}
		System.out.println(sb.toString());
	}
	
	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;
		return -1;
	}
}

发表于 2016-06-11 03:27:30 回复(0)
#include<iostream>
#include<string>
using namespace std;

int main()
{
    string s1,s2;
    cin>>s1>>s2;
    bool hash[256] = {false};
    int len_1 = s1.length(),len_2 = s2.length();

    for(int i=0;i<len_2;++i)
    {
        s2[i] = towupper(s2[i]);
        hash[s2[i]]=true;
    }
    for(int i=0;i<len_1;++i)
    {
        s1[i] = towupper(s1[i]);
        if(hash[s1[i]]==false)
            cout<<s1[i];
        hash[s1[i]]=true;
    }

    return 0;
}


发表于 2015-06-09 16:44:35 回复(8)
#include<stdio.h>
#include<string.h>
#include <ctype.h>
int main (){//the shorter,the better.
    char s1[80],s2[80],i,h[123] = {0};
    for(;~scanf("%s%s",s1,s2);){
        for(i=0;i<strlen(s2);h[toupper(s2[i++])]=1);
        for(i=0;i<strlen(s1);h[toupper(s1[i])]?:putchar(toupper(s1[i])),h[toupper(s1[i++])]=1);
    }
}

发表于 2018-01-30 00:17:36 回复(2)
import java.util.Scanner;
import java.util.ArrayList;
public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
            char[] ch = sc.nextLine().toCharArray();
            String str = sc.nextLine();
            ArrayList<Character> lt = new ArrayList<>();
            for(int i=0;i<ch.length;i++){
                String c = String.valueOf(ch[i]);
                if(!str.contains(c)){
                    if(ch[i]>='a' && ch[i]<='z'){
                        ch[i]=(char)(ch[i]-32);
                    }
                    if(!lt.contains(ch[i])){
                        lt.add(ch[i]);
                    }
                }
            }
            for(Character cc : lt){
                System.out.print(cc);
            }
        }
    }
}

发表于 2018-10-26 14:39:49 回复(0)
#include <cstdio>
#include <cstring>

int main()
{
    int A[128],k=0,B[80];
    char x='x';
    int num=0;
    memset(A,-1,sizeof(A));
    while(x!='\n'){ //读入第一行字符串,使读到的字符对应位置的A[128]置零
        scanf("%c",&x);
        B[num++] = x;   //B中装入第一个字符串
        k = (int)x;
        A[k]++;
        if(A[k]!=-1)
            A[k] = 0;
    }
    B[num-1] = '\0';
    x='r';    
    for(int i=0;x!='\n';i++){   //读入第二行字符串,使对应位置的A[128]加一
        scanf("%c",&x);
        k = (int)x;
        A[k]++;
    }
    for(int i=0;B[i]!='\0';i++){     //输出,注意大小写的问题
        int sb = B[i];
        if(A[sb]==0){
            if(sb>=97 && sb<=122){
                printf("%c",sb-32);
                A[sb-32] = 1;
            }
            else
                printf("%c",sb);
            A[sb] = 1;
        }
    }
    return 0;
}
简单说两句,思路大概是这样的,建立一个大小为128的数组A,将其中全部值置为-1,"memset(A,-1,sizeof(A))".
接着读入第一行字符串,使用B[80]将其存储,同时使A中对应的ascii值进行加一操作,并最后置为0。
再然后读入第二行字符串,使其每个字符对应的ascii值对应A的位置,并将对应的A[i]进行加一操作。
最后输出,以B(即第一行字符串)作为被循环字符串,每个字符的ascii值对应数组A,将为0
的值输出即可。
很惭愧,一点微小的贡献。
发表于 2018-02-28 22:18:30 回复(0)
import java.util.*;

/**
 * 旧键盘
 * 题目描述
 * 旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。现在给出应该输入的
 * 一段文字、以及实际被输入的文字,请你列出肯定坏掉的那些键。
 * 输入描述:
 * 输入在2行中分别给出应该输入的文字、以及实际被输入的文字。每段文字是不超过80个字符的串,
 * 由字母A-Z(包括大、小写)、数字0-9、以及下划线“_”(代表空格)组成。题目保证2个字符串均非空。
 * 输出描述:
 * 按照发现顺序,在一行中输出坏掉的键。其中英文字母只输出大写,每个坏键只输出一次。题目保证至少有1个坏键。
 * 输入例子:
 * 7_This_is_a_test
 * _hs_s_a_es
 * 输出例子:
 * 7TI
 *
 * @author shijiacheng
 * @date 2018/2/1
 */
public class B1019OldKeyboard {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String old = sc.next();
        String result = sc.next();

        Map<Character, Integer> mapResult = new HashMap<>();
        Map<Character, Integer> mapOld = new HashMap<>();

        char[] charsResult = result.toUpperCase().toCharArray();
        char[] charsOld = old.toUpperCase().toCharArray();

        for (int i = 0; i < charsResult.length; i++) {
            if (!mapResult.containsKey(charsResult[i])) {
                mapResult.put(charsResult[i], i);
            }
        }
        List<Character> list = new ArrayList<>();
        for (int i = 0; i < charsOld.length; i++) {
            if (!mapResult.containsKey(charsOld[i])) {
                if (!mapOld.containsKey(charsOld[i])) {
                    mapOld.put(charsOld[i], i);
                    list.add(charsOld[i]);
                }
            }
        }
        for (int i = 0; i < list.size(); i++) {
            System.out.print(list.get(i));
        }
    }
}
发表于 2018-02-01 22:22:59 回复(0)
这种题目用python 我觉得就是欺负人嘛==
继续贴python版本==
a,b=raw_input(),raw_input()
c=[i.upper() for i in a if i not in b]

print "".join( sorted( list(set(c)),key=c.index ) )
喜欢python同学欢迎关注我啊 ==   共同琢磨怎么把代码写得优雅精悍  ^_^
编辑于 2016-01-21 23:24:21 回复(7)
提供思路。
若输入的两个字符串长度分别为m、n,则时间复杂度  O(m+n)
根据题目,由于键盘损坏时候出现的状况仅仅是不显示,那么完全可以这么做:
对输入1进行hash,由于所有的正确按键都应该响应,仅仅只有坏的按键不响应,那么对照hash判断输入2,对存在的字符进行标记;
那么遍历输入2一遍以后,没有被标记的字符就是有问题的坏键盘按键,顺序输出即可。
编辑于 2015-06-09 11:35:51 回复(0)
import java.util.Scanner;
 
public class Main {
 
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String begin = scanner.nextLine().toUpperCase();
        String end = scanner.nextLine().toUpperCase();
        StringBuilder result = newStringBuilder();
        for(inti = 0; i < begin.length(); i++) {
            if(end.indexOf(begin.charAt(i)) == -1&& result.toString().indexOf(begin.charAt(i)) == -1) {
                result.append(begin.charAt(i));
            }
        }
        System.out.println(result);
    }
}

发表于 2018-03-17 13:34:54 回复(0)
#include <iostream>
#include <cstring>
using namespace std;

int main(){
    char a[90],b[90];
    int hashtable[128]={0};                       //ASCII码个数为128
    cin>>a;cin>>b;
    int len1=strlen(a);
    int len2=strlen(b);
    for(int i=0;i<len1;i++){
        char c1,c2;int j;
        for(j=0;j<len2;j++){
            c1=a[i];c2=b[j];
            if(c1>='a'&&c1<='z') c1=c1-'a'+'A';    //转化小写为大写
            if(c2>='a'&&c2<='z') c2=c2-'a'+'A';
            if(c1==c2) break;
        }
        if(j==len2&&hashtable[c1]==0){             //在第二个字符串中没有出现c1,且c1没有被输出过
            printf("%c",c1);
            hashtable[c1]=1;
        }
    }
    return 0;
}

编辑于 2018-01-24 23:13:29 回复(0)
import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;
/**
 * 
 * @author MSK
 * 改题不能使用TreeSet保存,因为TreeSet虽然是有序不重复的,但是题目要求有序(按照发现顺序)输出
 * TreeSet在再次发现已有元素,会影响原数据的位置。所以不能使用,使用字符串保存。
 */
public class OldKey_19 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String t = sc.next().toUpperCase();
		String f = sc.next().toUpperCase();
		int len = t.length();
		int  j = 0;
		String c = "";
		boolean flag = true;
		for ( int i = 0; i < len; i++){	
			if(j < f.length()){
				if(t.charAt(i) != f.charAt(j)){
					if(flag){
						flag = false;
						c = t.substring(i, i+1);
					}else if(c.indexOf(t.charAt(i)) < 0){
						c = c+t.charAt(i);
					}
				}else
					j++;						
			}else if(c.indexOf(t.charAt(i)) < 0){
				c = c+t.charAt(i);
			}
		}	
			System.out.print(c);

	}
}


发表于 2017-08-26 15:26:53 回复(0)
三三两两简简单单C++
#include <iostream>
#include <string>
using namespace std;
 
int main(int argc, char** argv) {
     
    string one, two;
    int htr[128] = {0};
    cin >> one >> two;
    for(auto i:two)
        htr[toupper(i)] = 1;
    for(auto i:one){
        i = toupper(i);
        if(htr[i]==0)
            cout << i;
        htr[i] = 1;
    }
     
    return 0;
}


编辑于 2020-02-13 15:41:03 回复(0)
#include<iostream>
#include<cstring>
#include<cctype>
using namespace std;
int main()
{
    string a,b;
    int cnt = 0;
    int pos[100] = {0};
    cin >> a >> b;
    for(int i = 0;a[i]!='\0';i++){
        if(a[i] != b[cnt]){
            a[i] = toupper(a[i]);
            if(pos[a[i]] == 0)    cout << a[i],pos[a[i]] = 1;
        }
        else cnt++;
    }
    return 0;

发表于 2018-03-11 10:42:03 回复(0)

为什么会段错误-.-

#include <stdio.h>
#include <ctype.h>
int main(){
 char A[81],B[123] = {0}, ch, i = 0, tag = 1;
 gets(A);
 while (A[i] != '\0'){
  tag = ((ch = getchar()) == '\n' ? 0 : 1);
  while ((tag && toupper(A[i]) != toupper(ch)) || !tag && A[i] != '\0'){
   if (B[toupper(A[i])]++ == 0)
   printf("%c", toupper(A[i]));
   i++;
  }
  i++;
 }
 return 0;
}

发表于 2017-08-09 11:12:49 回复(0)
#include <iostream>
#include <string>
using namespace std;
intmain()
{
    string ideal, real, output = ""; cin >> ideal >> real;
    for(inti = 0, j = 0; i < ideal.length(); i++)
        if(ideal[i] != real[j]) {
            chartemp = toupper(ideal[i]);
            bool notYetContained = true;
            for(intk = 0; k < output.length(); k++)
                if(output[k] == temp) {
                    notYetContained = false;
                    break;
                }
            if(notYetContained) output += temp;
        }
        elsej++;
    cout << output;
    return0;
}
发表于 2017-04-09 10:30:34 回复(0)
#include <iostream>
#include <string>
using namespace std;

int main()
{
    string right,wrong; cin >> right >> wrong;
    int num = right.size();
    string result; int index = 0;
    while(num--){
        if(right[0] == wrong[0]){
            right.erase(right.begin());
            wrong.erase(wrong.begin());
        }
        else{
            char ch = right[0];
            if(ch > 'a' && ch < 'z') ch -= 32;
            if(result.find(ch) == string::npos)
            result += ch;
            right.erase(right.begin());
        }
    }
    cout << result << endl;
    return 0;
}
发表于 2015-08-09 16:42:44 回复(0)