一道ACM搜索水题,用STL做的,不大懂,求牛人解释……

welon123 2010-09-11 12:02:12
http://acm.hdu.edu.cn/showproblem.php?pid=1106
题目:
Problem Description
输入一行数字,如果我们把这行数字中的‘5’都看成空格,那么就得到一行用空格分割的若干非负整数(可能有些整数以‘0’开头,这些头部的‘0’应该被忽略掉,除非这个整数就是由若干个‘0’组成的,这时这个整数就是0)。

你的任务是:对这些分割得到的整数,依从小到大的顺序排序输出。



Input
输入包含多组测试用例,每组输入数据只有一行数字(数字之间没有空格),这行数字的长度不大于1000。

输入数据保证:分割得到的非负整数不会大于100000000;输入数据不可能全由‘5’组成。


Output
对于每个测试用例,输出分割得到的整数排序的结果,相邻的两个整数之间用一个空格分开,每组输出占一行。


Sample Input
0051231232050775


Sample Output
0 77 12312320

[size=14px]STL用的很少,牛人帮忙解释一下,越详细越好,先谢谢啦……


代码:
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

int main(){
string s, sub;
vector<int> v;

while(cin >> s){
v.clear();
for ( int i = 0; i < s.size(); i++ ){
if ( s[i] == '5' ){
if ( !sub.empty() ) { //这是什么,这里什么意思 ,sub 也是容器?
v.push_back( atoi( sub.c_str() ) ); //auti??
sub = "";
}
}
else{
sub += s[i];
}
}
if ( !sub.empty() ) {
v.push_back( atoi( sub.c_str() ) );
sub = "";
}

sort(v.begin(), v.end());

for ( i = 0; i < v.size() - 1; i++ ){
cout << v[i] << ' ';
}
cout << v[i] << endl;
}

return 0;
}
[/size]
...全文
165 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
盛夏 2012-04-24
  • 打赏
  • 举报
回复
此题使用string类和排序函数就OK

#include <string>
#include <iostream>
#include <algorithm>
#include <stdio.h>
using namespace std;

int main()
{
string str;

while(cin>>str)
{
int uPos = 0;
int a[100000];
memset(a,0,sizeof(a));
while(uPos<str.length()&&uPos!=string::npos)
{
uPos = str.find("5",uPos);
if(uPos!=string::npos)
str.replace(uPos,1," ");
} //将所有的5换成空格
uPos = 0;
int uBeginPos = 0;
int uEndPos = uBeginPos;
while(uBeginPos<str.length()&&uBeginPos!=string::npos)
{
uBeginPos = str.find_first_not_of(' ',uBeginPos);
if(uBeginPos!=string::npos)
{
uEndPos = str.find(' ',uBeginPos);
a[uPos] = atoi(str.substr(uBeginPos,uEndPos - uBeginPos).c_str());//解出每个数字

uBeginPos = uEndPos;
uPos++;
}
}
sort(a,a+uPos); //数字排序,从小到大

for(int i = 0;i<uPos;i++)
{
if(i == 0)
cout<<a[i];
else
cout<<' '<<a[i];
}
cout<<endl;
}
return 0;
}
harderman 2010-09-11
  • 打赏
  • 举报
回复
帮顶.
pengzhixi 2010-09-11
  • 打赏
  • 举报
回复
if ( s[i] == '5' ){
if ( !sub.empty() ) { //这是什么,这里什么意思 ,sub 也是容器?

可以将string 看成是一个字符容器。它有提供empty成员函数测试是否为空

v.push_back( atoi( sub.c_str() ) ); //转成int类型的一个函数
FrankHB1989 2010-09-11
  • 打赏
  • 举报
回复
std::string本身不是一个泛型容器,而是类模板std::basic_string的一个实例,一般有:

// in namespace std scope;
typedef basic_string<char> string;

拟容器std::basic_string具有容器的一些性质,因此某些场合下std::string可以当作char的容器使用。
npuhuxl 2010-09-11
  • 打赏
  • 举报
回复
这个问题用std::istringstream 比较好。
Applic 2010-09-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 pengzhixi 的回复:]
if ( s[i] == '5' ){
if ( !sub.empty() ) { //这是什么,这里什么意思 ,sub 也是容器?

可以将string 看成是一个字符容器。它有提供empty成员函数测试是否为空

v.push_back( atoi( sub.c_str() ) ); //转成int类型的一个函数
[/Quote]

string有string::empty()方法

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧