華爲oj【分解字符串】

題目

按要求分解字符串,輸入兩個數M,N;M代表輸入的M串字符串,N代表輸出的每串字符串的位數,不夠補0。例如:輸入2,8, “abc” ,“123456789”,則輸出爲“abc00000”,“12345678“,”90000000”

代碼

#include<iostream>
#include<string>
#include<vector>
using namespace std;

vector<string> ResolveStr(vector<string> &vec,int m,int n)
{
	int strlengh=0;int veclen=vec.size();
	for(int i=0;i<veclen;i++)
{
	strlengh=vec[i].length();
	if(strlengh<n)
		vec[i].insert(vec[i].end(),n-strlengh,'0');
	if(strlengh==n)
		;
	else
	{
	while(strlengh>n)
	{
		
		string temp=vec[i].substr(n,strlengh);
		strlengh=temp.size();
		vec[i]=vec[i].assign(vec[i].begin(),vec[i].begin()+8);
		vec.push_back(temp);
		i++;
		veclen++;
	}
	i--;
	}
}
	return vec;
}
int main()
{
int m=0,n=0;
cin>>m>>n;
vector<string> vec(m);
for(int i=0;i<m;i++)
cin>>vec[i];
ResolveStr(vec,m,n);
for(int i=0;i<vec.size();i++)
{
	cout<<vec[i]<<endl;
}
system("pause");
return 0;
}

注意事項:
1.我這裏偷了懶,輸入兩個數M,N並沒有嚴格按照2,8的格式(用逗號隔開);見下圖

2.注意計算向量和字符串的長度時不要用sizeof直接算,推薦用vector、string的length()或者size()函數
3.至於帶有逗號的輸入方式如何處理,可以參考輸出偶數,奇數之和,即使用流化方法或者以逗號爲數字串邊界拷貝子串的方法;
4.ResolveStr函數中的wile(strlengh>n)是專門用來處理過長字符串的(長度大於規定的n),也是分解的關鍵,將多餘部分(大於n的子串)拷貝到temp中,只保留合法的子串,然後把temp放到向量中,更新i和veclen(向量裏字符串的個數由於分解的緣故是動態變化的所以要更新),當前串再無過長子串後,分解的迭代過程結束,i向上回溯,對非超長子串進行處理;
5.因爲分解循環中temp串都是放到向量最後的,改變輸入順序結果如下,所以如果要求分解的串相互挨着則可以把vec.push_back(temp)改爲使用vector::insert()函數,有興趣的可以進一步研究。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章