美文网首页PAT
1029.旧键盘

1029.旧键盘

作者: yzbkaka | 来源:发表于2018-08-06 17:24 被阅读2次

    题目描述

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

    输入描述

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

    输出描述

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

    输入例子

    7_This_is_a_test
    _hs_s_a_es

    输出例子

    7TI

    我的代码

    #include<stdio.h>
    #include<string.h>
    int main(){
        char a[1000],b[1000],c[1000];
        int len1,len2,i,j,k=0,t=0,m=0,d[1000];
        scanf("%s",a);
        scanf("%s",b);
        len1=strlen(a);
        len2=strlen(b);
        for(i=0;i<len1;i++){   //开始寻找出错的按键
            for(j=0;j<len2;j++){
                if(a[i]!=b[j]){
                    k++;
                    if(k==len2){   //如果没有找到
                    c[t]=a[i];   //将这些字符放在字符串c[ ]中
                    t++;
                    }
                }
             }
             k=0;   //k要赋初值0
        }  
        k=0;
        for(i=0;i<t;i++){   //将小写字母转换成大写字母
            if(c[i]>=97&&c[i]<=122){
                c[i]=c[i]-32;
            }
        }
        for(i=0;i<t;i++){   //开始排除重复的字符
            for(j=i+1;j<t;j++){
                if(c[i]==c[j]){
                d[k]=j;   //将重复字符的下标存储在数组d[ ]中
                k++;    
                }
            }
        }
        for(i=0;i<t;i++){   //开始输出
            for(j=0;j<k;j++){
               if(i!=d[j]){   //如果下标之前存在于数组d[ ]当中
                m++;
                if(m==k){
                    printf("%c",c[i]);
                   }
               }
            }
            m=0;
        }
        return 0;
    } 
    

    我的分析

    这道题算是我绞尽脑汁的一道题了。我的思路是先将输入的两段字符串相比较,将第二段中所缺少的字符存在c[ ]数组中,然后就是将c数组中的小写字母换成大写的,接着就是在输出时不将重复的字符再次输出,我也就是卡在了这里很长时间,后来想到了代码所示的方法:先用一个数组将c[ ]中重复的字符位置记下来,然后在输出之前先判断它的位置是否在数组里面,如果不在,则输出,如果在,就不能重复输出。

    相关文章

      网友评论

        本文标题:1029.旧键盘

        本文链接:https://www.haomeiwen.com/subject/fcumvftx.html