熱門文章

2025年10月5日 星期日

ZeroJudge 解題筆記:f291. 試算表大小

作者:王一哲
日期:2025年10月5日


ZeroJudge 題目連結:f291. 試算表大小

解題想法


先將讀到的字串拆成左側字母、右側數字兩個部分,再從字母最後面往回讀取,計算是第幾欄,再將欄數乘以列數就是答案。

Python 程式碼


使用時間約為 18 ms,記憶體約為 3.3 MB,通過測試。
s = input()  # 輸入的儲存格編號
left = ""  # 左半邊的欄位
row = 0  # 列數
for i, c in enumerate(s):  # 依序讀取 s 的字元
    if c.isdigit():  # 如果 c 是數字,取出左半邊,中止迴圈
        left = s[:i]
        row = int(s[i:])
        break
b = 1  # 計算欄位的基底
col = 0  # 欄位編號
for c in left[::-1]:  # 從 left 最後面讀取字元
    col += b*(ord(c) - ord('A') + 1)  # 計算欄位
    b *= 26  # 基底乘以 26
print(row*col)  # 答案是列、欄相乘


C++ 程式碼


使用時間約為 3 ms,記憶體約為 356 kB,通過測試。
#include <iostream>
#include <string>
#include <cctype>
using namespace std;

int main() {
    ios::sync_with_stdio(0); cin.tie(0);
    string s, left = ""; cin >> s;  // 輸入的儲存格編號,左半邊的欄位
    int row = 0;  // 列數
    for(int i=0; i<(int)s.size(); i++) {  // 依序讀取 s 的字元
        if (isdigit(s[i])) {  // 如果 c 是數字,取出左半邊,中止迴圈
            left = s.substr(0, i);
            row = stoi(s.substr(i));
            break;
        }
    }
    int b = 1, col = 0;  // 計算欄位的基底,欄位編號
    for(auto it = left.crbegin(); it != left.crend(); it++) {  // 從 left 最後面讀取字元
        col += b*(*it - 'A' + 1);  // 計算欄位
        b *= 26;  // 基底乘以 26
    }
    cout << row*col << "\n";  // 答案是列、欄相乘
    return 0;
}


沒有留言:

張貼留言