需求:给定一个整数序列,KiKi想把其中的重复的整数去掉,并将去重后的序列从小到达排序输出。
第一行,输入一个整数n,表示序列有n个整数。
第二行输入n个整数(每个整数大于等于1,小于等于1000),整数之间用空格分隔。
输入:
6 5 3 3 4 2 2
输出:
2 3 4 5
分析:
动态数组的划分,和冒泡排序保证从小到大。
题干给我们重要提示要求所有数字非0,所以说就可以采取重复化0法来完成题目
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n;
scanf("%d", &n);
int* p = (int*)malloc(n * sizeof(int));
for (int i = 0; i < n; i++)
{
scanf("%d", p + i);
}//数组创建完毕
for (int i = 0; i < n - 1; i++)
{
for (int j = 0; j < n - 1 - i; j++)
{
if (p[j] > p[j + 1])
{
int temp = p[j];
p[j] = p[j + 1];
p[j + 1] = temp;
}
}
}//冒泡排完序确保从小到大排列
for (int i = 0; i < n; i++)
{
int gel = p[i];
if (p[i] == 0)//说明已经被删除
continue; //直接跳过循环
else
for (int j = i + 1; j < n; j++)
{
if (p[j] == gel) //出现重复就判断为0
p[j] = 0;
}
}
//删除重复后得到的是一个从小到大有序排列的一个数组
int sum = 0;
for (int i = 0; i < n; i++)
{
if (p[i] != 0)
sum++;
}//求出来新数组的大小
int* arr = (int*)malloc(sum * sizeof(int));
int j = 0;
for (int i = 0; i < n; i++)
{
if (*(p + i) != 0)
{
*(arr + j) = *(p+i);
j++;
}
}
for (int i = 0; i < sum; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
感谢大家的点赞!
一起进步!