- #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次即可。