《编程思维与实践》1028.排序去重

《编程思维与实践》1028.排序去重

题目

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DuZwOJLm-1680880211040)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230407223048116.png)]

思路

法一(最方便):直接将所有数据进行排序,相同数据则会排在相邻位置,控制输出保证不输出相同数据即可.

法二(桶排序):桶排序就是将数组分到有限数量的桶里再对每个桶进行个别排序.在这题中注意到数据最大只有1000,只需要开大小为1001的数组,之后将出现的数字数组存为1,不出现存0,输出时顺序或逆序输出不为0的数组对应的数字即可.

注意的点:

一组数据的输入可以直接用EOF来判断输入是否结束,如果是多组数据则需要分割字符串.

代码

法一:

#include<stdio.h>
#include<stdlib.h>

int cmp1(const void *a,const void *b)
{
    
    
	int *m=(int*)a;
	int *n=(int*)b;
	return *m-*n;               //升序 
}

int cmp2(const void *a,const void *b)
{
    
    
	int *m=(int*)a;
	int *n=(int*)b;
	return *n-*m;                       //降序 
}

int main()
{
    
    
	char judge;
	judge=getchar();
	int number[100];
    int i=0;
    while(scanf("%d",&number[i])!=EOF)    //EOF判断一组数据输入结束
    {
    
    
        i++;
    }
	if(judge=='A')
	{
    
    
		qsort(number,i,sizeof(int),cmp1);  
	}
	if(judge=='D')
	{
    
    
		qsort(number,i,sizeof(int),cmp2);
	}
	for(int j=0;j<i;j++)
	{
    
    
		printf("%d ",number[j]);
		while(number[j]==number[j+1])  //相同只输出一个
		{
    
     
			j++;
		}
	}
	return 0; 
}

法二:

#include<stdio.h>
#include<stdlib.h>

int main()
{
    
    
	char judge;
	judge=getchar();
	int tab[1001]={
    
    0};
    int number;
    while(scanf("%d",&number)!=EOF)    //EOF判断一组数据输入结束
    {
    
    
        if(tab[number]==0)
        {
    
    
            tab[number]=1;
        }
    }
	if(judge=='A')
	{
    
    
		for(int j=0;j<1001;j++)
        {
    
    
            if(tab[j]==1)
            {
    
    
                printf("%d ",j);
            }
        } 
	}
	if(judge=='D')
	{
    
    
		for(int j=1000;j>=0;j--)
        {
    
    
            if(tab[j]==1)
            {
    
    
                printf("%d ",j);
            }
        } 
	}
	return 0; 
}

猜你喜欢

转载自blog.csdn.net/boxueyuki/article/details/130022542