数组去重自定义函数
做法1思想:
开一个数组b[],然后逐个跟a[]里面的元素判断,不重复了就放进b[]中,
最后遍历完a[],再把b[]拷贝给a[],其中的思想就是借助双指针在两个数组上进行操作
#include <iostream>
#include <stdio.h>
#include <math.h>
using namespace std;
int fun(int a[],int n)
{
int b[100];
//初始两个数组第一个元素相同
b[0] = a[0];
//双指针算法:i遍历a[],j遍历b[];
int i = 0,j = 0;
while(i < n) //以主数组a[]的长度为边界
{
//只要数值相同,往后遍历i指针
if(b[j] == a[i])
i ++;
else
{
//当数值不同的时候,先更新j,在赋值
j ++;
b[j] = a[i];
}
}
//遍历完j+1就是新数组的长度
n = j + 1;
//把b[]还给a[]
for (int k = 0;k < n;k ++ ) a[k] = b[k];
return n;
}
int main()
{
int a[] = {2,2,2,3,4,4,5,6,6,6,6,7,7,8,9,9,10,10,10,10},n = 20;
printf("原始数组:");
for (int i = 0; i < n; i ++ )
printf("%d ",a[i]);
printf("数组长度:%d",n);
//去重函数
n = fun(a,n);
//打印去重完以后的数组a[]
printf("\n去重数组:");
for (int i = 0; i < n; i ++ )
printf("%d ",a[i]);
printf("数组长度:%d",n);
return 0;
}
做法2思想:
其实这道题可以直接把双指针用在同一个数组a[],在同一个数组上面操作
本质就是找到数组的规律和关键点,这道题给我们的是有序的数组让我们去重
关键点就在于所有重复的元素都是一段一段的出现,那么我们让i指针去找不同,
找到相邻不同的元素即是从一段重复元素跳到另一端重复元素上去,
最后每一次跳跃点的元素,直接交给j,让j从数组a[]下标0开始每一次跳跃就更新j即可
最后j就是去重结束的结果数组
理解以后,3,4行代码就够定
int fun(int a[],int n)
{
int j=0;
for(int i = 0;i < n;i ++)
if(a[i] != a[i + 1]) a[j ++] = a[i];
return j;
}
看完整版的
#include <iostream>
#include <stdio.h>
#include <math.h>
using namespace std;
int fun(int a[],int n)
{
int j=0;
for(int i = 0;i < n;i ++)
if(a[i] != a[i + 1]) a[j ++] = a[i];
return j;
}
int main()
{
int a[] = {2,2,2,3,4,4,5,6,6,6,6,7,7,8,9,9,10,10,10,10},n = 20;
printf("原始数组:");
for (int i = 0; i < n; i ++ )
printf("%d ",a[i]);
printf("数组长度:%d",n);
//去重函数
n = fun(a,n);
//打印去重完以后的数组a[]
printf("\n去重数组:");
for (int i = 0; i < n; i ++ )
printf("%d ",a[i]);
printf("数组长度:%d",n);
return 0;
}