b981 - YoJudge 預練(時間之章)
題目描述
題目要求將各種格式的時間單位(小時、分鐘、秒、毫秒)轉換為毫秒,並輸出轉換後的毫秒數。輸入為多行字串,每行包含一個時間格式,直到 EOF 為止。
解題思路
這題主要考驗字串解析的能力。程式碼透過迴圈逐一讀取字串中的每個字元,並根據字元的類型(數字、'h'、'm'、's'、'.')來判斷時間單位的類型,並將其轉換為毫秒數。使用一個 tmp 變數來儲存當前時間單位的數值,並使用 ans 變數來累加總的毫秒數。當遇到時間單位符號時,將 tmp 轉換為對應的毫秒數,並加到 ans 中,然後將 tmp 重置為 0。
複雜度分析
- 時間複雜度: O(n),其中 n 是輸入字串的長度。因為程式碼需要遍歷輸入字串中的每個字元。
- 空間複雜度: O(1),因為程式碼只使用了幾個常數大小的變數來儲存中間結果。
程式碼
#include <iostream>
using namespace std;
string s;
int main(){
cin.tie(0); ios::sync_with_stdio(false);
while(cin >> s){
long tmp=0,ans=0,ba=0;
for(int i=0;i<s.size();++i){
if(s[i]>='0'&&s[i]<='9'){
tmp*=10;
tmp+=s[i]-'0';
}
else if(s[i]=='h'){
if(s[i+1]=='o')i+=2;
ans+=tmp*60*60*1000;
tmp=0;
}
else if(s[i]=='m'&&s[i+1]!='s'){
if(s[i+1]=='i')++i;
ans+=tmp*60*1000;
tmp=0;
}
else if(s[i]=='s'){
ans+=tmp*1000;
tmp=0;
}
else if(s[i]=='.'){
i++;
tmp*=10;
tmp+=s[i]-'0';
ans+=tmp*100;
tmp=0;
}
else if(s[i]=='m'&&s[i+1]=='s'){
i++;
ans+=tmp;
tmp=0;
}
}
cout << ans << "\n";
}
}