题目描述: 输入n个整数的序列,要求对这个序列进行去重操作。所谓去重,是指对这个序列中每个重复出现的整数,只保留该数第一次出现的位置,删除其余位置。
输入描述: 输入包含两行,第一行包含一个正整数n(1 ≤ n ≤ 1000),表示第二行序列中数字的个数;第二行包含n个整数(范围1~5000),用空格分隔。
输出描述: 输出为一行,按照输入的顺序输出去重之后的数字,用空格分隔。
方法①
#include <stdio.h>
//欠考虑的法一,会将该输入进行递增排序后输出,不会保留输入的顺序,还是需要重新优化的,看法二
int main()
{
int n = 0;
int arr[5001] = {0};
int i = 0;
scanf("%d",&n);
for(i=0; i<n; i++)
{
//进行整数的存储
int tmp = 0;
scanf("%d",&tmp);
if( arr[tmp] == 0 )
arr[tmp]=1;
}
for(i=0; i<5001; i++)
{
if(arr[i] == 1)
printf("%d ",i);
}
return 0;
}
## 基础循环的方法二呀
//法二:此方法可能复杂度会过大,如要进一步优化,则可以参考方法三使用两个数组,在输入的时候便和输出数组进行对比!
int main()
{
int n = 0;
int arr[1000];//用于存储元素
scanf("%d",&n);
int i = 0;
//输入
for(i=0; i<n; i++)
{
scanf("%d",&arr[i]);
}
//去重
for(i=0; i<n; i++)
{
//判断下标为i的元素 arr[i] 是否在后面位置出现
int j = 0;
for(j=i+1; j<n; j++)
{
if(arr[i] == arr[j])
{
//去重
//将j+1的位置的元素全部向前移动一位!
int k = 0;
for(k=j; k<n-1; k++)//将k的范围最大固定到n-1,防止其越界访问
{
arr[k]=arr[k+1];
}
n--;
j--;//为了避免j跳过元素,需要--
}
}
}
//输出
for(i=0; i<n; i++)
{
printf("%d ",arr[i]);
}
return 0;
}
##还不错的方法三呀!
方法③
int main()
{
int n;
//第一行包含一个正整数n(1 ≤ n ≤ 1000)
int arr1[1000]={0}; //作为输入数组存储信息
int arr2[1000]={0}; //作为输出数组用于筛选去重后的数字
scanf("%d",&n);
int num=0;//用于统计去重后元素的个数
for(int i=0;i<n;i++){
int sum=0;//用于表示该元素是否为重复元素
scanf("%d ",&arr1[i]);//输入数组①
for(int j=0;j<i;j++){
if(arr2[j]==arr1[i]){ //检测输出数组②中是否已经存在此数
sum=1;
break;
}
}
//sum=0说明if循环未进入则输出数组中无此数
//将满足的值输入二数组
if(sum==0)
{ //说明此时为非重复元素
arr2[num]=arr1[i];//将该元素存储到arr2输出数组中
num++;//个数++
}
}
for(int i=0;i<num;i++){ //输出去重后的数组
printf("%d ",arr2[i]);
}
return 0;
}