[字符串]HDU1106 字符串相关练习

题目:HDU 1106

地址:http://acm.hdu.edu.cn/showproblem.php?pid=1106

解题:最近看了很多关于string的函数,拿这题试下手。

心得:

  1. 编译器要选C++啊 魂淡!

代码:

version1:

15MS 336K 923 B
(一无是处。。╮(╯▽╰)╭)

#include<iostream>
#include<algorithm>
#include<string>
#include<cstring>
using namespace std;
bool cmp(string a, string b)
{
	int la = a.length(), lb = b.length();
	if(la!=lb)
		return la<lb;
	else
		return a<b;
}
void zero(string &str)//这里纠结了很久,字符串删去一个节点后长度相应减小,所以i是不能动的。
{
	int i = 0, l = str.length();
	while(str.length()!=1&&str[i]=='0')
		str.erase(0,1);
}
int main()
{
	freopen("in.txt","r",stdin);
	string str, num[1050];
	int start, end, cnt, i, l;
	while (getline(cin,str))
	{
		cnt = 0;
		l = str.length();
		start = str.find_first_not_of("5",0);
		while ((end = str.find("5", start))!=-1&&end<l)
		{
			num[cnt++] = str.substr(start,end-start);
			start = str.find_first_not_of("5",end);
		}
		if(start!=-1&&start<l)
			num[cnt++] = str.substr(start,l-start);
		for(i=0;i<cnt;i++)
			zero(num[i]);
		sort(num,num+cnt,cmp);
		for(i=0;i<cnt;i++)
		{
			cout<<num[i];
			if(i==cnt-1)
				cout<<endl;
			else
				cout<<" ";
		}

	}
}

version2:

0MS 320K 397 B
(现阶段的最优版本)

#include <iostream>
#include <cstring>
#include<algorithm>
using namespace std;
int main()
{
	int cnt, num[1005], i;
	char s[1005];
	while(gets(s))
	{
		cnt = 0;
		char *p=strtok(s,"5");//失散多年的字符串切割函数
		while(p!=NULL)
		{

			num[cnt++] = atoi(p);
			p=strtok(NULL,"5");
		}
		sort(num,num+cnt);
		cout<<num[0];
		for(i=1;i<cnt;i++)
			cout<<" "<<num[i];
		cout<<endl;

	}
	return 0;
}


 
 

version3:

0MS 324K 584 B

你可能感兴趣的:([字符串]HDU1106 字符串相关练习)