# String Parsing# String Stream# Basic Arithmetic

d018 - 字串讀取練習

🔗 前往 ZeroJudge 原題

題目描述

題目要求解析包含序號和實數的字串,計算奇數序號對應實數的和,減去偶數序號對應實數的和,並輸出結果。字串的格式為 "序號:實數",序號可能不連續。

解題思路

程式碼首先讀取一行字串。然後,將字串中的冒號替換為空格,以便使用 stringstream 進行解析。接著,使用 stringstream 從字串中提取序號和實數。對於每一組序號和實數,判斷序號是奇數還是偶數,如果是奇數則將實數加到總和中,如果是偶數則將實數減去。最後,輸出計算得到的總和。

複雜度分析

  • 時間複雜度: O(n),其中 n 是輸入字串的長度。因為需要遍歷字串一次來替換冒號,以及使用 stringstream 解析字串。
  • 空間複雜度: O(1),因為使用的額外空間是常數級別的,例如替換冒號時的字串修改,以及 stringstream 的緩衝區。

程式碼

#include <iostream>
#include <string>
#include <sstream>
using namespace std;
int main(){
	std::ios::sync_with_stdio(false);
    cin.tie(NULL);
	int z;
	string a;
	while(getline(cin,a)){
		for(z=0;z<a.length();z++){
			if(a[z]==':') 
				a[z]=' ';
		}
		stringstream s(a);
		float n,num=0;
		while(s>>z){
			s>>n;
			if(z%2==1) 
				num+=n;
			else 
				num-=n;	
		}
		cout<<num<<endl;
	}
}

Discussion