日期:2025年9月5日
ZeroJudge 題目連結:d586. 哈密瓜美語
解題想法
這題用兩個字典建立數字轉英文、英文轉數字的對照表,再依照讀取到的測資開頭是數字或字母,判斷要從哪一個表格找答案。
Python 程式碼
使用時間約為 49 ms,記憶體約為 5.5 MB,通過測試。
s1 = "mjqhofawcpnsexdkvgtzblryui" # 數字轉英文用的字串
s2 = "uzrmatifxopnhwvbslekycqjgd" # 英文轉數字用的字串
ntoc, cton = dict(), dict() # 數字轉英文、英文轉數字的對照表
for i, c in enumerate(s1, start=1): ntoc[str(i)] = c
for i, c in enumerate(s2, start=1): cton[c] = i
n = int(input()) # n 道謎題
for _ in range(n): # 執行 n 次
line = list(input().split()) # 讀取一行資料分割後存入串列
m = int(line[0]) # 資料長度為 m
if line[1].isalpha(): # 如果 line[1] 是字母
print(sum(cton[c] for c in line[1:])) # 依序讀取 line[1] ~ line[-1] 代入表中找數字求加總
else: # 如果 line[1] 是數字
print("".join([ntoc[i] for i in line[1:]])) # 依序讀取 line[1] ~ line[-1] 代入表中找字母組成字串
C++ 程式碼
使用時間約為 23 ms,記憶體約為 360 kB,通過測試。
#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;
int main() {
ios::sync_with_stdio(0); cin.tie(0);
string s1 = "mjqhofawcpnsexdkvgtzblryui"; // 數字轉英文用的字串
string s2 = "uzrmatifxopnhwvbslekycqjgd"; // 英文轉數字用的字串
unordered_map<int, char> ntoc; // 數字轉英文的對照表
unordered_map<string, int> cton; // 英文轉數字的對照表
for(int i=0; i<26; i++) ntoc[i+1] = s1[i];
for(int i=0; i<26; i++) {
string s (1, s2[i]); // 將 s2[i] 轉成長度為 1 的字串 s
cton[s] = i+1;
}
int n; cin >> n; // n 道謎題
for(int i=0; i<n; i++) { // 執行 n 次
int m; cin >> m; // 資料長度為 m
string s; cin >> s; // 暫存資料用的字串,先讀取一個字串
if (isalpha(s[0])) { // 如果 s[0] 是字母
int isum = cton[s]; // 加總,預設為 s 對應的數字
for(int j=1; j<m; j++) { // 讀取 m-1 個字串
cin >> s; isum += cton[s];
}
cout << isum << "\n";
} else { // 如果 line[1] 是字母
string t (1, ntoc[stoi(s)]); // 儲存答案用的字串,預設為 s 對應的字母
for(int j=1; j<m; j++) { // 讀取 m-1 個字串
cin >> s; t += ntoc[stoi(s)];
}
cout << t << "\n";
}
}
return 0;
}
沒有留言:
張貼留言