Shaky_00 发表于 2020-3-11 01:28:04

求助!一个关于C语言数组的算法

编写一个算法,对字符串将从开始至末尾重复的整数移到第一个出现的那个数后面。
例如:1 2 3 3 5 7 7 5 3 4 9
变成:1 2 3 3 3 5 5 7 7 4 9


尝试了很久找不到一个最合适的方法,求问各路大神有没有办法来支支招~{:5_109:}

SHRS23 发表于 2020-3-11 05:08:22

#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;        //num = 6 表示数字3出现6次
        int flag;        //flag = 1 表示前面已经出现过3;flag = 0 表示第一次遇到5

        int index;        //index[]存储数字出现的顺序
        //如输入 1 3 3 8
        //index = 1
        //index = 3
        //index = 8

        //清空数组
        //非全局数组必须初始化
        for(j=0;j<20;j++)
        {
                num = 0;index = 0;flag = 0;
        }

        //读入数据
        do
        {
                scanf("%d", &input);

                //记录input数字出现次数
                num++;
                //如果首次遇到input数字,需要将新数字存入顺序数组index[]
                if (flag != 1)
                {
                        index = input;
                        i++;
                }
                //将input数字标记为已出现过
                flag = 1;
        }
        while((ch=getchar())!='\n'&&ch!=EOF);

        //外层循环遍历顺序数组index[]
        for(j=0;j<i;j++)
        {
                //内层循环控制index输出的次数,即index数字的个数
                for (k=0;k<num];k++)
                {
                        printf("%d ", index);
                }
        }
}



这题如果真的按照题目所说用“移动”方法个人认为很难实现

为了实现这一效果建议采取另外的思路:
输入只有两样有效的信息,一是数字的排列顺序,二是每个数字出现的次数
分别处理这两条信息:

首先记录输入的数字顺序,这里需要去除重复,即不考虑每个数字出现多少次
这个顺序由代码中的index[]数组实现

然后记录每个数字出现的次数,这里不需要考虑数字顺序
次数的记录对应程序代码中的num[]数组

输出时按照index顺序输出num次即可。

SHRS23 发表于 2020-3-11 05:09:23

代码不复杂,包含注释显得有点乱了

Shaky_00 发表于 2020-3-11 09:03:23

SHRS23 发表于 2020-3-11 05:08
这题如果真的按照题目所说用“移动”方法个人认为很难实现

为了实现这一效果建议采取另外的思路: ...

感谢!!
页: [1]
查看完整版本: 求助!一个关于C语言数组的算法