PAT-basic-1029 旧键盘 java c++

发布时间 2023-04-12 16:44:13作者: 正明小佐

一、题目


旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。现在给出应该输入的一段文字、以及实际被输入的文字,请你列出肯定坏掉的那些键。

输入格式:

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

输出格式:

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

输入样例:

7_This_is_a_test
_hs_s_a_es
 

输出样例:

7TI

二、解析


用hashmap来记录应该出现的字符,如果出现了就置1,没有就置0;

实际出现的字符,出现了就置0,不再考虑;

然后遍历hashmap中还是1的字符,将其放入额外的list中,只需要放一次,所以放完就置0;大小写字母也只需要放一个。

最后遍历list中的字符,如果是小写字母,则输出大写字母,其他的照例输出。

三、代码


java ac版:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Scanner;

public class Main {
    private static Scanner input = new Scanner(System.in);
    public static void main(String[] args) {
        String text = input.nextLine();
        String actText = input.nextLine();

        //用hashmap来记录应该出现的字符,如果出现了就置1,没有就置0
        HashMap<Character, Boolean> map = new HashMap<>();

        for (int i = 0; i < text.length(); i++) {
            char c = text.charAt(i);
            if(!map.containsKey(c))
                map.put(c, false);
        }
        for (int i = 0; i < actText.length(); i++) {
            char c = actText.charAt(i);
            if(map.containsKey(c))
                map.put(c, true);
        }
        //需要用额外的一个列表来存储坏掉的键,并处理大小写字母,因为大小字母坏了一个,两个都是坏的
        ArrayList<Character> list = new ArrayList<>();
        for (int i = 0; i < text.length(); i++) {
            char c = text.charAt(i);
            if(!map.get(c)){
                if(Character.isAlphabetic(c)){
                    if(list.contains(Character.toLowerCase(c)) || list.contains(Character.toUpperCase(c)))
                        continue;
                }
                list.add(c);
                map.put(c, true);
            }
        }
        for (Character e : list) {
            if(Character.isAlphabetic(e))
                System.out.print(Character.toUpperCase(e));
            else
                System.out.print(e);
        }
    }
}

 

c++ ac版:

//
// Created by dongdong on 2023/4/11.
//
#include <map>
#include <vector>
#include "iostream"
#include "algorithm"
int main(){
    char* text=new char [81];
    char* actText=new char [81];
    scanf("%s %s", text, actText);
//    std::cin>>text>>actText;

    std::map<char, int> map;
    int i=0;
    while(text[i] != '\0'){
        if(map[text[i]] == 0){
            map[text[i]] = 1;
        }
        i++;
    }
    for(int j=0; actText[j] !='\0'; j++){
        if(map[actText[j]] == 1)
            map[actText[j]] = -1;
    }

    std::vector<char> vec;
    for(i=0; text[i] != '\0'; i++){
        char ch = text[i];
        if(map[ch] == 1){
            if((ch >= 'a' && ch <= 'z') || (ch >='A' && ch<='Z')){
                auto item = std::find(vec.begin(), vec.end(), tolower(ch));
                auto item1 = std::find(vec.begin(), vec.end(), toupper(ch));
                if(item != vec.end() || item1 != vec.end()) continue;
            }
            vec.push_back(ch);
            map[ch] = -1;
        }
    }
    for(int i=0; i<vec.size(); i++){
        if(islower(vec[i]))
            printf("%c", toupper(vec[i]));
        else
            printf("%c", vec[i]);
    }
    return 0;
}