励志用少的代码做高效表达。
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; }
如果这篇文章对你产生了帮助,就请给博主一个赞吧!让更多的人看到它。