牛客题:https://www.nowcoder.com/practice/f59b914172b94c69a2b29ad0a1d9b1a7
描述
给定一个整数序列,KiKi想把其中的重复的整数去掉,并将去重后的序列从小到大排序输出。
输入描述:
第一行,输入一个整数n,表示序列有n个整数。
第二行输入n个整数(每个整数大于等于1,小于等于1000),整数之间用空格分隔。
输出描述:
去重并且从小到大排列的整数序列,整数之间用空格分隔。
输入:
6 5 3 3 4 2 2输出:
2 3 4 5
方法一:暴力求解法
先将整数排序,再去重。
可以采用很多种排序方法,本次我们采用希尔排序——详见我的这篇博客http://t.csdn.cn/zbA2s
int main()
{
int n = 0;
scanf("%d", &n);
int arr[1000] = { 0 };
for (int i = 0; i < n; i++)
{
scanf("%d", &arr[i]);
}
//排序--希尔排序
int gap = n;
while (gap > 1)
{
gap = gap / 2;
for (int i = 0; i < n-gap; i++)
{
int end = i;
int tmp = arr[end + gap];
while (end >= 0)
{
if (tmp < arr[end])
{
arr[end + gap] = arr[end];
end = end - gap;
}
else
{
break;
}
}
arr[end + gap] = tmp;
}
}
//去重
for (int i = 0; i < n-1; i++)
{
if (arr[i] == arr[i + 1])
{
int j = 0;
for (j = i + 1; j < n - 1; j++)
{
arr[j] = arr[j + 1];
}
n--;
i--;
}
}
//输出
for (int i = 0; i < n; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
方法二:以空间换时间
创建一个数组,将每次录入的数字存放到数组对应的下标上,录入完成后,就相当于完成了去重和排序双重工作,直接将数组中不是0的元素打印出来就可以。
完整代码:
//方法二:
int main()
{
int n = 0;
scanf("%d", &n);
int arr[1001] = { 0 };
int m = 0;
for (int i = 0; i < n; i++)
{
scanf("%d", &m);
arr[m] = m;
}
for (int i = 0; i <= 1000; i++)
{
if (arr[i] != 0)
{
printf("%d ", arr[i]);
}
}
return 0;
}