# String Parsing# Greedy# Math

b981 - YoJudge 預練(時間之章)

🔗 前往 ZeroJudge 原題

題目描述

題目要求將各種格式的時間單位(小時、分鐘、秒、毫秒)轉換為毫秒,並輸出轉換後的毫秒數。輸入為多行字串,每行包含一個時間格式,直到 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";
	}
}

Discussion