PAT

1029.旧键盘

2018-08-06  本文已影响2人  yzbkaka

题目描述

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

输入描述

输入在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[ ]中重复的字符位置记下来,然后在输出之前先判断它的位置是否在数组里面,如果不在,则输出,如果在,就不能重复输出。

上一篇 下一篇

猜你喜欢

热点阅读