第十一题:明明的随机数

题目描述

明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了 N 个 1 到 1000 之间的随机整数(N≤100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作。

输入描述

第 1 行为 1 个正整数,表示所生成的随机数的个数:N。

第 2 行有 N 个用空格隔开的正整数,为所产生的随机数。

输出描述

输出 2 行,第 1 行为 1 个正整数 M,表示不相同的随机数的个数。

第 2 行为 M个用空格隔开的正整数,为从小到大排好序的不相同的随机数。

输入输出样例

示例 1

输入

10
20 40 32 67 40 20 89 300 400 15

输出

8
15 20 32 40 67 89 300 400

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 128M

分析:

我拿到这个题的时候,第一个想到的是用链表,所以我花了四十分钟左右用链表实现了,但我参考了大佬的写法,太巧妙了,所以我会连同大佬的代码(会标明大佬的ID)一同进行分享和记录。

代码:

我用链表实现:
#include <stdio.h>
#include <stdlib.h>
//定义链表的结构体
struct ListNode {
	int num;
	struct ListNode* next;
};

//创建节点
struct ListNode* createNode(int num) {
	struct ListNode* newNode = (struct ListNode*)malloc(sizeof(struct ListNode));
	newNode->num = num;
	newNode->next = NULL;
	return newNode;
}
//输出链表
void printf_out(struct ListNode* head) {
	while(head != NULL) {
		printf("%d ",head->num);
		head = head->next;
	}
	printf("\n");
}
//去重
int quchong(struct ListNode* head,int M) {
	struct ListNode* p1 = NULL;//头
	struct ListNode* p2 = NULL;//移动寻找
	struct ListNode* p3 = NULL;//p2的前一位
	struct ListNode* p4 = NULL;//便于free
	p1 = head;
	while(p1 != NULL) {
		p2 = p1->next;
		p3 = p1;
		while(p2 != NULL) {
			if(p1->num == p2->num) {
				p4 = p2;
				p2 = p2->next;
				p3->next = p2;
				free(p4);
				M++;
				continue;
			}
			p3 = p2;
			p2 = p2->next;
		}
		p1 = p1->next;
	}
  return M;
}
//排序
void paixu(struct ListNode* head) {
    struct ListNode* p1 = NULL; // 头
    struct ListNode* p2 = NULL; // 移动和p1比大小
    int swapped = 1; // 用于检测是否发生交换
    while (swapped) {
        swapped = 0;
        p1 = head;
        while (p1->next != NULL) {
            p2 = p1->next;
            if (p1->num > p2->num) {
                // 交换p1和p2的num值
                int temp = p1->num;
                p1->num = p2->num;
                p2->num = temp;
                swapped = 1; // 发生了交换
            }
            p1 = p1->next;
        }
    }
}
int main(int argc, char *argv[]) {
	int N,M = 0,K;
	scanf("%d",&N);
	struct ListNode* head = NULL;
	struct ListNode* L1 = NULL;
	head = L1;
	for(int i =0; i<N; i++) {
		scanf("%d",&K);
		L1 = createNode(K);
		//头插法
		L1->next = head;//L1->next 指向NULL
		head = L1;//head始终指向头
	}
	//printf_out(head); 
	printf("%d\n",N - quchong(head,M));  
	//printf_out(head);
	paixu(head); 
	printf_out(head);
	return 0;
}
大佬的代码:

蓝桥ID(晴天互动队队长

#include <iostream>//头文件
using namespace std;
int main() {
    bool a[1001]={0};//定义一个桶
    int n,i,x;
    cin>>n;//输入数量
    for(i=1;i<=n;i++){
        cin>>x;//读入数据
        a[x]=1;//统计数据+去重
    }
    n=0;
    for(i=1;i<=1000;i++){
        if(a[i]==1)n++;//统计数量
    }
    cout<<n<<endl;//输出数量
    for(i=1;i<=1000;i++){
        if(a[i]==1)cout<<i<<" ";//最后的输出
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值