d586 - 哈密瓜美語
題目描述
題目描述了哈密瓜老師設計的一種特殊的加密方式。加密方式分為兩種:
- 數字轉字母:將數字對應到特定的字母表中,將數字序列轉換為字母序列。
- 字母轉數字:將字母對應到特定的字母表中,將字母序列轉換為數字序列,並計算數字總和。 題目給定多組測試案例,每組案例包含一個數字或字母序列,要求根據序列的類型進行解密,並輸出解密後的結果。
解題思路
程式首先讀取測試案例的數量 n。然後,對於每個測試案例,程式讀取序列的長度 m 和序列本身。
程式根據序列的第一個字符判斷序列的類型:
- 如果第一個字符是數字,則將序列中的每個數字轉換為對應的字母,並輸出字母序列。
- 如果第一個字符是字母,則將序列中的每個字母轉換為對應的數字,並計算數字總和,然後輸出總和。
程式使用兩個字符串
eng和num來存儲字母表,分別用於數字轉字母和字母轉數字的映射。
複雜度分析
- 時間複雜度: O(n * m),其中 n 是測試案例的數量,m 是序列的長度。因為對於每個測試案例,程式需要遍歷序列中的每個字符。
- 空間複雜度: O(1),程式使用的額外空間是固定的,不隨輸入大小而變化。
程式碼
#include <iostream>
using namespace std;
int main(){
cin.tie(0); ios::sync_with_stdio(false);
int n,m;
string eng=" mjqhofawcpnsexdkvgtzblryui",num=" uzrmatifxopnhwvbslekycqjgd",chat;
cin >> n;
while(n--){
cin >> m;
--m;
cin >> chat;
if(chat[0]<'a'){
int q=0;
if(chat.length()==2)
q=(chat[0]-'0')*10+chat[1]-'0';
else
q=(chat[0]-'0');
cout << eng[q];
while(m--){
cin >> q;
cout << eng[q];
}
}
else{
char q=chat[0];
int ans=0;
for(int i=1;i<=26;++i){
if(num[i]==q){
ans+=i;
break;
}
}
while(m--){
cin >> q;
for(int i=1;i<=26;++i){
if(num[i]==q){
ans+=i;
break;
}
}
}
cout << ans ;
}
cout << "\n";
}
}