# String Manipulation# Greedy# Simulation

j179 - 資料分類 (Classification)

🔗 前往 ZeroJudge 原題

題目描述

題目給定一個數字字串,要求不斷地將字串中的相鄰數字相乘,直到字串長度為 1 為止。如果相乘結果為 0,則直接保留 0。

解題思路

這題的核心是模擬題目描述的相鄰數字相乘過程。程式碼使用一個 while 迴圈,只要字串長度大於 1 就持續進行相乘操作。在迴圈內部,根據字串長度分為三種情況:

  1. 字串長度大於 3:將前兩個數字和後兩個數字相乘,然後將結果連接起來。
  2. 字串長度大於 2:將前兩個數字和後兩個數字相乘,然後將結果連接起來。
  3. 字串長度等於 2:將兩個數字相乘,然後將結果連接起來。 在每次相乘後,將結果更新為新的字串 s。最後,如果字串長度為 0,則將其設定為 "0"。

複雜度分析

  • 時間複雜度: O(n^2),其中 n 是初始字串的長度。因為在每次迴圈中,都需要計算相乘結果並將其轉換為字串,這個過程的複雜度與字串長度有關。最壞情況下,字串長度會不斷減小,但每次減小的幅度不大,因此時間複雜度近似為 O(n^2)。
  • 空間複雜度: O(n),其中 n 是初始字串的長度。因為在每次迴圈中,都需要儲存相乘結果的字串,這個字串的長度最壞情況下與初始字串長度相同。

程式碼

#include <iostream>
#include <algorithm>
using namespace std;
string s;
int main(){
	cin >> s;
	while(s.size()>1){	
		if(s.size()>3){
			int r=(s[0]-'0')*(s[1]-'0');
			int l=(s[2]-'0')*(s[3]-'0');
			if(s[2]=='0')l=s[3]-'0';
			string nxt,nxt2;
			while(r){
				nxt+=r%10+'0';
				r/=10;
			}
			reverse(nxt.begin(),nxt.end());
			if(l==0)nxt2="0";
			while(l){
				nxt2+=l%10+'0';
				l/=10;
			}
			reverse(nxt2.begin(),nxt2.end());
			s=nxt+nxt2;
		}
		else if(s.size()>2){
			int r=(s[0]-'0')*(s[1]-'0');
			int l=(s[1]-'0')*(s[2]-'0');
			string nxt,nxt2;
			while(r){
				nxt+=r%10+'0';
				r/=10;
			}
			reverse(nxt.begin(),nxt.end());
			if(l==0)nxt2="0";
			while(l){
				nxt2+=l%10+'0';
				l/=10;
			}
			reverse(nxt2.begin(),nxt2.end());
			s=nxt+nxt2;
		}
		else{
			int r=(s[0]-'0')*(s[1]-'0');
			string nxt;
			while(r){
				nxt+=r%10+'0';
				r/=10;
			}
			reverse(nxt.begin(),nxt.end());
			s=nxt;
		}
	}
	if(s.size()==0)s="0";
	cout << s;
}

Discussion