18行代码AC_排序 HDU - 1106(sstream简单解法)

励志用少的代码做高效表达。


Problem describe

输入一行数字,如果我们把这行数字中的‘5’都看成空格,那么就得到一行用空格分割的若干非负整数(可能有些整数以‘0’开头,这些头部的‘0’应该被忽略掉,除非这个整数就是由若干个‘0’组成的,这时这个整数就是0)。
你的任务是:对这些分割得到的整数,依从小到大的顺序排序输出。

Input

输入包含多组测试用例,每组输入数据只有一行数字(数字之间没有空格),这行数字的长度不大于1000。
输入数据保证:分割得到的非负整数不会大于100000000;输入数据不可能全由‘5’组成。

Output

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


题意分析

题意:给定字符串, 用5分割, 将分割后的数据排序输出, 字符串不能全为5,每个数据最大不超过10E。

在网上看了很多形形色色的解法。 很多代码甚至洋洋洒洒写到了一百多行。 所谓考虑不够,特判来凑。其中很多代码都用在了条件的特殊判断上。

但我觉得出题人的本意并不是想考细节,而是考查对C语言stroke()函数或c++sstream的用法。

这里我用的是sstream头文件分割函数。 具体做法是:

首先将字符串遍历, 5全部替换为空格, 接下来使用stringstream将字符串转化为int型变量, 配合while循环使用,会自动以空格为界限划分变量, 存入数组后排序即可。

只用了18行代码成功AC。 是不是很简单!!!

对sstream头文件不了解的请戳这里——>神奇的sstream头文件(整型与字符串自由转换)


代码展示

#include<bits/stdc++.h> 
using namespace std;
int main() {
    
    
	ios::sync_with_stdio(false);
	string s; 
	while(cin>>s) {
    
    
		int len = s.length(); 
		for(int i = 0; i < len; i++) 
			if(s[i] == '5') s[i] = ' ';
		
		int num;
		vector<int>v;
		stringstream ss; ss << s; 
		while(ss >> num) v.push_back(num);
		
		sort(v.begin(), v.end());
		int len1 = v.size();
		for(int i = 0; i < len1; i++) cout<<v[i]<<(i==len1-1?'\n':' '); 
	}
return 0; }


如果这篇文章对你产生了帮助,就请给博主一个赞吧!让更多的人看到它。

猜你喜欢

转载自blog.csdn.net/weixin_43899069/article/details/108665283