hdu 1106 排序(水题)
Posted Linux C/C++程序员
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu 1106 排序(水题)相关的知识,希望对你有一定的参考价值。
题目描述:
输入一行数字,如果我们把这行数字中的‘5’都看成空格,那么就得到一行用空格分割的若干非负整数(可能有些整数以‘0’开头,这些头部的‘0’应该被忽略掉,除非这个整数就是由若干个‘0’组成的,这时这个整数就是0)。你的任务是:对这些分割得到的整数,依从小到大的顺序排序输出。
输入:
输入包含多组测试用例,每组输入数据只有一行数字(数字之间没有空格),这行数字的长度不大于1000。输入数据保证:分割得到的非负整数不会大于100000000;输入数据不可能全由‘5’组成。
例如:0051231232050775
输出:
对于每个测试用例,输出分割得到的整数排序的结果,相邻的两个整数之间用一个空格分开,每组输出占一行。
例如:0 77 12312320
解题思路:
题目不难,注意细节。之前坑在了中间有一堆5的测试数据上。
字符串转成整数的方法:sscanf函数(string.h头文件中)、atoi函数(stdlib.h头文件中)
给出几个测试数据:
(1)开头带一个5:5123
(2)开头带许多5:55555123
(3)结尾带一个5:1235
(4)结尾带许多5:12355555
(5)中间带许多5:12355555456
(6)全零序列:000000000000000000000000000000000000000
(7)没有5:123
AC代码:
1 #include <stdio.h> 2 #include <string.h> 3 #include <vector> 4 #include <algorithm> 5 #include <functional> 6 7 char szSeq[1010]; 8 int iHead, iTail; 9 std::vector<int> vecNums; 10 11 void Init() 12 { 13 vecNums.clear(); 14 iHead = 0; 15 iTail = strlen(szSeq); 16 } 17 18 int GetNumber() 19 { 20 char szNum[1010] = { 0 }; // 虽然数字大小不会超过100000000,但是如果很多的0呢,数组开小了,会越界。 21 int iCount = 0, iNum = -1; 22 int flag = false; // false:未获取到数字;true:获取到数字 23 while (iHead < iTail && ‘5‘ == szSeq[iHead]) ++iHead; // 处理数字前面的‘5‘ 24 while (iHead < iTail && ‘5‘ != szSeq[iHead]) // 获取数字 25 { 26 flag = true; 27 szNum[iCount++] = szSeq[iHead++]; 28 } 29 if (true == flag) 30 sscanf(szNum, "%d", &iNum); //把字符转换成数字 31 return iNum; 32 } 33 34 void OutPutVec() 35 { 36 for (std::vector<int>::iterator iter = vecNums.begin(); iter != vecNums.end(); ++iter) 37 { 38 if (iter == vecNums.begin()) 39 printf("%d", *iter); 40 else 41 printf(" %d", *iter); 42 } 43 printf("\n"); 44 } 45 46 int main(void) 47 { 48 int iNum; 49 while (EOF != scanf("%s", szSeq)) 50 { 51 Init(); 52 53 //从数字序列中获取所有的数字放入vecNums容器中 54 while (-1 != (iNum = GetNumber())) 55 vecNums.push_back(iNum); 56 57 std::sort(vecNums.begin(), vecNums.end(), std::less<int>()); 58 59 OutPutVec(); 60 } 61 return 0; 62 }
以上是关于hdu 1106 排序(水题)的主要内容,如果未能解决你的问题,请参考以下文章