无梦为安+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 安装svn网络有问题怎么办
  • ¥15 Python爬取指定微博话题下的内容,保存为txt
  • ¥15 vue2登录调用后端接口如何实现
  • ¥65 永磁型步进电机PID算法
  • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥15 latex怎么处理论文引理引用参考文献