无梦为安+1 2019-10-15 20:43 采纳率: 0%
浏览 215

求大佬解释一下这是怎么把重复的元素去掉的,小白没看懂?

求大佬解释一下这是怎么把重复的元素去掉的

#include <stdio.h>
void main()
{
    int i,j,k,a[]={4,78,20,30,19,0,30,20,8,7,3,1,90,86,437,918,0,1},ln;
    for(ln=sizeof(a)/sizeof(int),k=i=1;i<ln;i++)
    {
        for(j=0;j<k;j++)//
            if(a[j]==a[i]) break;//
                if(j>=k)         //
            {a[k]=a[i];k++;}    //
    }
    for(i=0;i<k;printf("%d ",a[i++]));
    printf("\n");
}


  • 写回答

2条回答

  • threenewbee 2019-10-15 23:16
    关注
    这程序写得有点怪,实际上ln是数组的长度
    k保存的是去掉重复的数,也就是a的开头。
    两重循环,外侧循环遍历a里面所有的数,下标是i
    内循环j从0遍历到k,看a[j]是否在a[i]里面出现,如果没有出现,放在a[k]的位置上。
    最后遍历输出。
    
    看下面的一个简单例子:
    对 a[] = {3,7,1,3,1,6,8}去重:
    首先k=1,因为a[0]=3,前面没有数字,所以3肯定是找到的第一个不重复的数
    之后在a[0]~a[k-1],也就是a[0]里面找,没找到7。说明7也是一个新找到的数字,此时a[1]=7,k=2
    之后遇到1,也是类似,此时a[2]=1,k=3
    关键来了,下面在a[0]-a[2]范围内找,找到了3,说明3是重复的,所以k不变,继续循环
    下面又找到1,继续循环
    下面遇到6,还是在a[0]-a[2]范围内找,没找到6,说明6也是新发现的数字,所以a[k]也就是a[2]=6,k=3
    下面遇到8,在a[0]-a[3]范围内找,没找到8,说明8也是新发现的数字,所以a[k]也就是a[3]=8,k=4
    最后数组{3,7,6,8,1,6,8},k=4
    输出a的0~3下标3 7 6 8就是a数组去掉重复之后的结果
    
    评论

报告相同问题?

悬赏问题

  • ¥15 MATLAB怎么通过柱坐标变换画开口是圆形的旋转抛物面?
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题
  • ¥15 Visual Studio问题
  • ¥20 求一个html代码,有偿