# String Parsing# Stringstream# Greedy# Iteration

d098 - Stringstream運用練習(C++)

🔗 前往 ZeroJudge 原題

題目描述

題目要求從輸入字串中提取僅包含數字的單字,並計算這些單字的總和。輸入字串包含多個以空格分隔的單字,可能有多個連續的空格。

解題思路

程式碼透過迭代輸入字串,並使用迴圈將字串分割成單字。對於每個單字,程式碼檢查它是否僅包含數字。如果單字僅包含數字,則將其轉換為整數並加到總和中。程式碼使用 getline 讀取整行輸入,然後使用迴圈和索引來提取單字。b.clear() 用於在處理完一個單字後清空 b 字串,以便處理下一個單字。

複雜度分析

  • 時間複雜度: O(n*m),其中 n 是輸入字串的長度,m 是單字的最大長度。最壞情況下,需要遍歷整個輸入字串,並檢查每個單字是否為數字。
  • 空間複雜度: O(m),其中 m 是單字的最大長度。程式碼使用一個字串 b 來儲存單字,其大小取決於單字的最大長度。

程式碼

#include <iostream>
#include <string>
using namespace std;
int main(){
	string a;
	while(getline(cin,a)){
		string b;
		int al=a.length(),ans=0;
		for(int i=0;i<=al;i++){
			if(a[i]!=' '&&i!=al){
				b+=a[i];
			}
			else{
				int bl=b.length();
				bool c=0;
				for(int j=0;j<bl;j++){
					if(b[j]>'9'||b[j]<'0'){
						c=1;
						break;
					}
				}
				if(c!=1){
					int x=0;
					for(int j=0;j<bl;j++){
						x*=10;
						x+=b[j]-48;
					}
					ans+=x;
				}
				b.clear();
			}
		}
		cout << ans << "\n";
	}
}

Discussion