【PAT】1014. 福爾摩斯的約會 (20)
阿新 • • 發佈:2018-04-26
mco using ace 奇怪 星期六 tps ble set 字母
1014. 福爾摩斯的約會 (20)
大偵探福爾摩斯接到一張奇怪的字條:“我們約會吧! 3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hyscvnm”。大偵探很快就明白了,字條上奇怪的亂碼實際上就是約會的時間“星期四 14:04”,因為前面兩字符串中第1對相同的大寫英文字母(大小寫有區分)是第4個字母‘D‘,代表星期四;第2對相同的字符是‘E‘,那是第5個英文字母,代表一天裏的第14個鐘頭(於是一天的0點到23點由數字0到9、以及大寫字母A到N表示);後面兩字符串第1對相同的英文字母‘s‘出現在第4個位置(從0開始計數)上,代表第4分鐘。現給定兩對字符串,請幫助福爾摩斯解碼得到約會的時間。
輸入格式:
輸入在4行中分別給出4個非空、不包含空格、且長度不超過60的字符串。
輸出格式:
在一行中輸出約會的時間,格式為“DAY HH:MM”,其中“DAY”是某星期的3字符縮寫,即MON表示星期一,TUE表示星期二,WED表示星期三,THU表示星期四,FRI表示星期五,SAT表示星期六,SUN表示星期日。題目輸入保證每個測試存在唯一解。
輸入樣例:3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hyscvnm輸出樣例:
THU 14:04
首先理解題意:
1.前兩個字符串包含星期和小時兩個信息,首先,兩個字符串在同一位置有相同的大寫字母代表了星期的信息,且大寫字母在A-G之間;
2.在表示星期的大寫字母的後面,再找相同的字符(包含大寫字母A-N,和數字0-9),,這個字符代表了小時的信息,例如:
YN6aBcmZD8oNp6 Yh6aBdmZg8lN
1)先找相同的大寫字母,得到B,表示星期二,其中,第一個位置的Y雖然相同,但不在A-G之間,大寫字母B之前的6和a也不滿足);
2)再在B之後找相同的字符,得到8,表示08點,其中m雖然相同,但不是大寫字母,大寫字母Z不在A-N之間,在8後面的N雖然也滿足條件,但已經確定了時間為08點,則N應該舍棄
註意在時間小於10(0-9)的時候,打印時間時前面需補0
3.在後兩個字符串中確定了分鐘的信息,需要找到相同的英文字母所在的位置(大寫和小寫字母均可),同樣只取第一個滿足條件的字符所在的位置,打印時不足兩位的同樣需要補0
程序說明:
1.確定需要比較的兩個字符串中較短的字符串長度,再進行比較;
2.判斷一個字符ch是不是大寫字母的三種方法:
isupper(ch);//是大寫字母返回非零值(true),否則返回零(false) if(ch>=‘A‘&&ch<=‘Z‘); if(ch>=65&&ch<=90);//65和90分別為A和Z對應的ASCII碼值
3.判斷一個字符ch是不是小寫字母的三種方法:
islower(ch);//是小寫字母返回非零值(true),否則返回零(false) if(ch>=‘a‘&&ch<=‘z‘) if(ch>=97&&ch<=122)//97和122分別為a和z對應的ASCII碼值
4.判斷是否是字母用 isalpha(ch),若是,返回非零值(true),否則返回零(false)
判斷是否是數字用 isdigit(num),若是,返回非零值(true),否則返回零(false)
**註意:上面提到的 isupper()、islower()、isdigit()、isalpha()均為宏定義,非真正的函數
5.在多余位置上補0的方法:
cout<<setw(n)<<setfill(‘0‘)<<i;
setw(n)表示設置位寬為 n,如果不進行設置,系統默認左對齊輸出,設置後為右對齊,空出的位置以空格填充
setfill(‘0‘)表示以單個字符‘0‘填充空余位置,註意:setfill()中參數只能為單個字符,setfill(0)或者 setfill("0")均報錯
i 為輸出項
C++代碼如下:
1 #include <bits/stdc++.h> 2 using namespace std; 3 int min(int a,int b){ 4 if(a<b) return a; 5 else return b; 6 } 7 int main() { 8 char str[4][60]; 9 int count=0; 10 string week[7]={"MON ","TUE ","WED ","THU ","FRI ","SAT ","SUN "}; 11 cin>>str[0]>>str[1]>>str[2]>>str[3]; 12 int len0,len2; 13 len0=min(strlen(str[0]),strlen(str[1])); 14 len2=min(strlen(str[2]),strlen(str[3])); 15 for(int i=0;i<len0;i++){ 16 if(str[0][i]==str[1][i]){ 17 if(count==0){ 18 if(str[0][i]>=‘A‘&&str[0][i]<=‘G‘){ 19 cout<<week[(str[0][i]-‘A‘)]; 20 count++; 21 } 22 } 23 else if(count==1){ 24 if(str[0][i]>=‘A‘&&str[0][i]<=‘N‘){ 25 cout<<(10+(str[0][i]-‘A‘))<<‘:‘; 26 break; 27 } 28 else if(isdigit(str[0][i])){ 29 cout<<setw(2)<<setfill(‘0‘)<<str[0][i]<<‘:‘; 30 break; 31 } 32 } 33 } 34 } 35 for(int i=0;i<len2;i++){ 36 if(str[2][i]==str[3][i]){ 37 if(isalpha(str[2][i])){ 38 cout<<setw(2)<<setfill(‘0‘)<<i; 39 break; 40 } 41 } 42 } 43 system("pause"); 44 return 0; 45 }
【PAT】1014. 福爾摩斯的約會 (20)