该题在ZOJ上的题号是1225。
题目描述如下:
Background
In this problem you will be given a series of lists containing both words and
numbers. The goal is to sort these lists in such a way that all words are in alphabetical
order and all numbers are in numerical order. Furthermore, if the nth element
in the list is a number it must remain a number, and if it is a word it must
remain a word.
Input
The input will contain multiple lists, one per line. Each element of the list
will be separated by a comma followed a space, and the list will be terminated
by a period. The input will be terminated by a line containing only a single
period.
Output
For each list in the input, output the
scramble sorted list, separating each element of the list with a comma followed
by a space, and ending the list with a period.
Sample Input
0.
banana, strawberry, OrAnGe.
Banana, StRaWbErRy, orange.
10, 8, 6, 4, 2, 0.
x, 30, -20, z, 1000, 1, Y.
50, 7, kitten, puppy, 2, orangutan, 52, -100, bird, worm, 7, beetle.
.
Sample Output
0.
banana, OrAnGe, strawberry.
Banana, orange, StRaWbErRy.
0, 2, 4, 6, 8, 10.
x, -20, 1, Y, 30, 1000, z.
-100, 2, beetle, bird, 7, kitten, 7, 50, orangutan, puppy, 52, wor
本题不是难题,根据题意,只需把输入中的数字和字符串分开,然后分别按照相应的规则进行排序,并记录下第i个是数字或者是字符,最后按照记录情况一次输出相应的元素即可。因为需要对字符串数组进行排序,因此第一印象是使用C++的string和STL中的sort函数,但是结果却因为懒得写一个排序函数多写了很多代码。
具体代码如下:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <string>
#include <cstring>
#include <algorithm>
#include <cctype>
using namespace std;
string s[80];
int a[80];
bool flag[80];
char buf[80];
bool cmp(string a, string b)
{
string tmpa = a;
string tmpb = b;
transform(a.begin(),a.end(), tmpa.begin(), ::tolower);
transform(b.begin(),b.end(), tmpb.begin(), ::tolower);
return tmpa < tmpb;
}
int main(void)
{
int alpha, num;
string t;
char *p;
int i, j;
int sign;
int tmp;
int k;
int m, n;
freopen("in.txt", "r", stdin);
while (fgets(buf, 80, stdin) != NULL && buf[0] != '.')
{
p = buf;
i = j = 0;
alpha = num = 0;
k = 0;
while (*p != '\n' && *p != '.')
{
while (*p == ' ')
++p;
sign = 1;
if (*p == '-' || isdigit(*p) || *p == '+')
{
if (*p == '-')
{
sign = -1;
++p;
}
else if (*p == '+')
++p;
tmp = 0;
while (*p != ',' && *p != '.')
{
tmp = tmp*10 + (*p-'0');
++p;
}
a[num++] = tmp*sign;
flag[k++] = false;
}
else
{
i = 0;
t = "";
while (*p != ',' && *p != '.')
{
t += *p;
++p;
++i;
}
s[alpha++] = t;
flag[k++] = true;
}
++p;
}
sort(a, a+num);
sort(s, s+alpha, cmp);
m = n = 0;
if (!flag[0])
{
printf("%d", a[0]);
++m;
}
else
{
printf("%s", s[0].c_str());
++n;
}
for (i = 1; i < k; ++i)
{
if (!flag[i])
{
printf(", %d", a[m]);
++m;
}
else
{
printf(", %s", s[n].c_str());
++n;
}
}
printf(".\n");
}
return 0;
}