C语言学习笔记

**

数组去重问题

**
数组去重问题,常常可能伴随着排序问题一起出现,下面分享几种数组去重问题的方法,每种方法在不同运用环境下,优势各为不同,处理问题时应灵活使用。
一、定义新数组法
定义一个新数组b[n],先将原数组根据要求排序,原数组为12 23 35 12 12 69,按升序排序后数组为12 12 12 23 35 69,再将排序后数组a[n]遍历,若不重复则将a[i]放入b[i]中,下面是代码实现。

int fun(int a[] int n)
{
	for(int i=0;i<n-1;i++)//冒泡排序
		for(int j=0;j<n-1-i;j++)
		 if(a[j]>a[j+1]
		 	{
		 		int t;
		 		t=a[j+1];
		 		a[j+1]=a[j];
		 		a[j]=t;
		 	}
	int b[N],index=0,sum=0;
	for(int k=0;k<n;k++)//去重并统计实际个数
		if(a[k]!=a[k+1])
			{
				b[index++]=a[k];
				sum++
			} 
			
	return (sum);
}

二、向前移位法
通过双重for循环,判断a[i]是否等于a[j],若相等,即该数组元素重复,再用循环将从这一位开始的所有数组向前移一位,即a[j]=a[j+1]
,比如 12 23 35 12 69,操作后数组元素为
12 23 35 69,但这样并不完全正确,若遇到这样的数组 12 23 35 12 12 69,如果通过上述操作后得到的数组元素应为 12 23 35 12 69,很显然该数组依然存在重复数组,所以为了确保移位后仍存在重复数组,在执行完上述操作后j的值应不变,下面是代码实现。

int fun (int a[], int n)
{
    int sum=0;//去重开始
    for(int j=0;j<n-1-sum;j++)
        for(int k=j+1;k<n-sum;k++)
            if(a[j]==a[k])
            {
                sum++;
              for(int i=k;i<n;i++)
                    a[i]=a[i+1];
                k--;//确保向前移位后不存在重复数组元素
            }//去重结束
    for(int i=0;i<n-1-sum;i++)//冒泡排序
        for(int j=0;j<n-i-1-sum;j++)
        if(a[j]>a[j+1])
        {
            int t;
            t=a[j];
            a[j]=a[j+1];
            a[j+1]=t;
        }
    return(n-sum);

}

三、重复数组元素特殊化
先通过循环将数组中重复的元素特殊化,比如
12 23 35 12 12 69,若数组元素不存在0,那么我们可以将重复的元素赋值为0,处理后的数组为 12 23 35 0 0 69,处理后根据题目要求再行设计,若题目只要求统计重复元素的个数,那么我们只需统计数组中0的个数即可,
一般题目可能会涉及到排序问题,那么我们根据题目要求合理将重复元素特殊化,比如上述元素去重后若以升序输出,那么将重复元素赋值为0较为方便,排序后数组为 0 0 12 23 35 69,这时再通过循环当扫描到第一个不为0的元素时,再用第二种方法将数组向前移0的个数位,操作后数组为 12 23 35 69,下面是代码实现。

int fun (int a[], int n)
{
    for(int j=0;j<n-1;j++)//去重开始
        for(int k=j+1;k<n;k++)
            if(a[j]==a[k]&&a[j]!=0)
                a[k]=0;

    for(int i=0;i<n-1;i++)//冒泡升序
        for(int j=0;j<n-i-1;j++)
        if(a[j]>a[j+1])
        {
            int t;
            t=a[j];
            a[j]=a[j+1];
            a[j+1]=t;
        }
           int T=0;
    for(int k=0;k<n;k++)//扫描到第一个不为零时向前移位
        if(a[k]!=0&&a[k-1]==0)
            {
                T=k;
                break;
            }
    for(int i=0;i<n-T;i++)
        a[i]=a[T+i];//去重结束

    return(n-T);
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值