1. 程式人生 > >PAT乙級 1029 舊鍵盤

PAT乙級 1029 舊鍵盤

舊鍵盤上壞了幾個鍵,於是在敲一段文字的時候,對應的字元就不會出現。現在給出應該輸入的一段文字、以及實際被輸入的文字,請你列出肯定壞掉的那些鍵。

輸入格式:

輸入在 2 行中分別給出應該輸入的文字、以及實際被輸入的文字。每段文字是不超過 80 個字元的串,由字母 A-Z(包括大、小寫)、數字 0-9、以及下劃線 _(代表空格)組成。題目保證 2 個字串均非空。

輸出格式:

按照發現順序,在一行中輸出壞掉的鍵。其中英文字母只輸出大寫,每個壞鍵只輸出一次。題目保證至少有 1 個壞鍵。

輸入樣例:

7_This_is_a_test
_hs_s_a_es

輸出樣例:

7TI

思路:

比對兩個字串的首字母,若不相同,記錄下正確字串中的字元並置標記為1,然後正確字串向後滑動;若相同,則同步向後滑動,直至到正確字串的末尾。遍歷記錄下來的壞鍵,將相同鍵位中除第一次出現之外的鍵標誌置0,最後輸出標誌為1的鍵位。

知識點補充:

C庫函式int toupper(int c)將小寫字母轉換為大寫,包含在標頭檔案ctype.h中返回值:該函式等效返回大寫字母C,如果存在這樣的值,否則c保持不變。返回值可以隱式轉換為char的int值。

程式碼:

#include<stdio.h>
#include<string.h>
#include<ctype.h>
typedef struct{
	char key;
	int sign;
}broken_key;
int main(){
	broken_key L[81];
	char right[81],wrong[81];
	scanf("%s%s",right,wrong);
	int i=0,j=0,k=0;
	int len=strlen(right);
	while(i<len){
		if(right[i]!=wrong[j]){
			L[k].key=toupper(right[i++]);
			L[k++].sign=1; 
		}
		else{
			++i,++j; 
		}
	}
	for(i=0;i<k;++i){
		if(L[i].sign==1){
			for(j=i+1;j<k;++j){
				if(L[j].key==L[i].key){
					L[j].sign=0;
				}
			}
		}
	}
	for(i=0;i<k;++i){
		if(L[i].sign!=0){
			printf("%c",L[i].key);
		}
	}	
	return 0;
}

在這裡插入圖片描述
看到一個非常巧妙的解法,這裡是地址: https://blog.csdn.net/Dodd9199/article/details/50976750