我是靠谱客的博主 瘦瘦楼房,最近开发中收集的这篇文章主要介绍明明的随机数(四种数组去重方法)前言一、暴力去重 + 冒泡排序二、利用冒泡排序的结果进行去重三、使用双指针对有序数组进行去重四、特殊解法(有局限性),觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
目录
前言
一、暴力去重 + 冒泡排序
二、利用冒泡排序的结果进行去重
三、使用双指针对有序数组进行去重
四、特殊解法(有局限性)
前言
题目描述:明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了 N 个 1 到 1000 之间的随机整数(N <= 100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成"去重"与"排序"的工作。
题目链接:[P1059 NOIP2006 普及组] 明明的随机数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)。
一、暴力去重 + 冒泡排序
#include <stdio.h>
#define N 100
void bubble_sort(int arr[], int n)
{
int i = 0;
int j = 0;
for (i = 0; i < n - 1; i++)
{
int flag = 1; // 假设 arr 已经有序
for (j = 0; j < n - 1 - i; j++)
{
if (arr[j] > arr[j + 1])
{
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
flag = 0;
}
}
if (flag)
{
break;
}
}
}
int main()
{
int arr[N] = { 0 };
int n = 0;
// 输入
scanf("%d", &n);
int i = 0;
for (i = 0; i < n; i++)
{
scanf("%d", &arr[i]);
}
// 暴力去重
int j = 0;
int k = 0;
for (i = 0; i < n; i++)
{
for (j = i + 1; j < n; j++)
{
if (arr[j] == arr[i])
{
for (k = j; k < n - 1; k++) // 将 arr[j] 后面的元素往前挪一个位置
{
arr[k] = arr[k + 1];
}
j--; // 原来 arr[j + 1] 的元素变成了 arr[j],避免漏掉重复的元素,所以让 j 减 1
n--; // 去掉重复的数字
}
}
}
// 排序(冒泡排序)
bubble_sort(arr, n);
// 输出
printf("%dn", n);
for (i = 0; i < n; i++)
{
printf("%d ", arr[i]);
}
printf("n");
return 0;
}
二、利用冒泡排序的结果进行去重
#include <stdio.h>
#define N 100
void bubble_sort(int arr[], int n)
{
int i = 0;
int j = 0;
for (i = 0; i < n - 1; i++)
{
int flag = 1; // 假设 arr 已经有序
for (j = 0; j < n - 1 - i; j++)
{
if (arr[j] > arr[j + 1])
{
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
flag = 0;
}
}
if (flag)
{
break;
}
}
}
int main()
{
int arr[N] = { 0 };
int n = 0;
// 输入
scanf("%d", &n);
int i = 0;
for (i = 0; i < n; i++)
{
scanf("%d", &arr[i]);
}
// 排序(冒泡排序)
bubble_sort(arr, n);
// 去重
for (i = 0; i < n - 1; i++)
{
if (arr[i] == arr[i + 1])
{
int j = 0;
for (j = i; j < n - 1; j++)
{
arr[j] = arr[j + 1];
}
i--;
n--;
}
}
// 输出
printf("%dn", n);
for (i = 0; i < n; i++)
{
printf("%d ", arr[i]);
}
printf("n");
return 0;
}
三、使用双指针对有序数组进行去重
#include <stdio.h>
#define N 100
void bubble_sort(int arr[], int n)
{
int i = 0;
int j = 0;
for (i = 0; i < n - 1; i++)
{
int flag = 1; // 假设 arr 已经有序
for (j = 0; j < n - 1 - i; j++)
{
if (arr[j] > arr[j + 1])
{
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
flag = 0;
}
}
if (flag)
{
break;
}
}
}
int main()
{
int arr[N] = { 0 };
int n = 0;
// 输入
scanf("%d", &n);
int i = 0;
for (i = 0; i < n; i++)
{
scanf("%d", &arr[i]);
}
// 排序(冒泡排序)
bubble_sort(arr, n);
// 使用双指针去重
int slow = 0;
int fast = 1;
for (fast = 1; fast < n; fast++)
{
if (arr[slow] != arr[fast])
{
arr[++slow] = arr[fast];
}
}
// 输出
n = slow + 1;
printf("%dn", n);
for (i = 0; i < n; i++)
{
printf("%d ", arr[i]);
}
printf("n");
return 0;
}
算法思路(前提是数组已经有序):
-
将 slow 和 fast 分别初始化为 0 和 1。
-
不断地增加 fast,直到 slow 的内容和 fast 的内容不相等,此时 slow 到 fast - 1 的元素重复,于是把 fast 的内容赋值给 ++slow。
-
重复第 2 步,直到 fast 到达尽头。
-
当整个循环结束后,slow + 1 即当前删除重复元素后的数组长度。
示例:
四、特殊解法(有局限性)
#include <stdio.h>
#define MAX 1000 // 随机数的最大值
int main()
{
int arr[MAX + 1] = { 0 };
int n = 0;
scanf("%d", &n);
int count = 0;
int tmp = 0;
int i = 0;
for (i = 0; i < n; i++)
{
scanf("%d", &tmp);
if (arr[tmp] == 0)
{
count++;
arr[tmp] = tmp;
}
}
// 输出
printf("%dn", count);
for (i = 1; i < MAX + 1; i++)
{
if (arr[i] != 0)
{
printf("%d ", arr[i]);
}
}
printf("n");
return 0;
}
最后
以上就是瘦瘦楼房为你收集整理的明明的随机数(四种数组去重方法)前言一、暴力去重 + 冒泡排序二、利用冒泡排序的结果进行去重三、使用双指针对有序数组进行去重四、特殊解法(有局限性)的全部内容,希望文章能够帮你解决明明的随机数(四种数组去重方法)前言一、暴力去重 + 冒泡排序二、利用冒泡排序的结果进行去重三、使用双指针对有序数组进行去重四、特殊解法(有局限性)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复