HDOJ 1106

HDOJ 1106
题目如上所示,看到题的第一眼就想用字符串分割取字符,转类型排序搞定~
具体思路:
以”5”为分割点对其自行分割,然后得到的string通过stringstream转为longlong形式 调用sort进行排序
stringstream在转类型的时候会自动去掉多余的0如”00070”转完自动为“70”
具体代码:

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

void splite(string &s,vector<string>&v,string &a,vector <long long> &num)
{
	string::size_type position1,position2;
	position1=0; 	
	//position1存放分隔完之后的起始位置
	//position2存放分割符的位置
	position2=s.find(a);
	while(position2!=string::npos)
	{
		
		if(s.substr(position1,(position2-position1))!="")  //判断这个位置截出来的是否为空,因为可能出现多个5的情况,连续的5截出来则会为“”若放入change中会造成多个重复数段
		{
			stringstream change;
			int x;
			change<<s.substr(position1,(position2-position1));
			change>>x;
			num.push_back(x);
		}
		position1=position2+a.size();
		position2=s.find(a,position1);
		
	}
	if(position1!=s.size())//既没有循环到和s长度一样,说明将会有一段遗漏 或者一开始没有要分割的 直接放入
	{
		if(s.substr(position1,(position2-position1))!="")
		{
			stringstream change;
			int x;
			change<<s.substr(position1,(position2-position1));
			change>>x;
			num.push_back(x);
		}
	}
}
int main()
{
	ios::sync_with_stdio(false);
	vector<string>v;
	vector <long long> num;
	string s;
	while(cin>>s)
	{
	string a="5";
	splite(s,v,a,num);
	sort(num.begin(),num.end());
	for(int i=0;i<num.size()-1;i++)
	{
		cout<<num[i]<<" ";
	}
	cout<<num[num.size()-1];
	cout<<endl;
	v.clear();
	num.clear();
	}
}

针对下面代码中判断是否为“”的作用在于若没有这个判断语句会出现如下的情况

	if(s.substr(position1,(position2-position1))!="") 

HDOJ 1106
本应该是123 488 66666却出现了123重复的情况这是因为当change流入空时候把之前的值反复传入了change中进行转换
这里可以发现有三个五 也就是出现了三个空的值 所以123会有三次的传值,因此在这里需要判断是否为空 不为空才将其传入以免出现错误的情况~
这就是这道题大概的思路啦~ヾ(◍°∇°◍)ノ゙加油!