#include<stdio.h>
/*编写一个算法,对字符串将从开始至末尾重复的整数移到第一个出现的那个数后面。
例如:1 2 3 3 5 7 7 5 3 4 9
变成:1 2 3 3 3 5 5 7 7 4 9*/
int main(void)
{
char ch;
int input = 0;
int i = 0;
int j,k;
int num[20]; //num[3] = 6 表示数字3出现6次
int flag[20]; //flag[3] = 1 表示前面已经出现过3;flag[5] = 0 表示第一次遇到5
int index[20]; //index[]存储数字出现的顺序
//如输入 1 3 3 8
//index[0] = 1
//index[1] = 3
//index[2] = 8
//清空数组
//非全局数组必须初始化
for(j=0;j<20;j++)
{
num[j] = 0;index[j] = 0;flag[j] = 0;
}
//读入数据
do
{
scanf("%d", &input);
//记录input数字出现次数
num[input]++;
//如果首次遇到input数字,需要将新数字存入顺序数组index[]
if (flag[input] != 1)
{
index[i] = input;
i++;
}
//将input数字标记为已出现过
flag[input] = 1;
}
while((ch=getchar())!='\n'&&ch!=EOF);
//外层循环遍历顺序数组index[]
for(j=0;j<i;j++)
{
//内层循环控制index[j]输出的次数,即index[j]数字的个数
for (k=0;k<num[index[j]];k++)
{
printf("%d ", index[j]);
}
}
}
这题如果真的按照题目所说用“移动”方法个人认为很难实现
为了实现这一效果建议采取另外的思路:
输入只有两样有效的信息,一是数字的排列顺序,二是每个数字出现的次数
分别处理这两条信息:
首先记录输入的数字顺序,这里需要去除重复,即不考虑每个数字出现多少次
这个顺序由代码中的index[]数组实现
然后记录每个数字出现的次数,这里不需要考虑数字顺序
次数的记录对应程序代码中的num[]数组
输出时按照index顺序输出num次即可。 |