鱼C论坛

 找回密码
 立即注册
查看: 4986|回复: 15

c语言中如何删除数组中的重复元素

[复制链接]
发表于 2019-11-10 10:48:54 | 显示全部楼层 |阅读模式
1鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-11-10 11:12:29 | 显示全部楼层
把你写的代码贴出来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-11-10 11:40:50 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-11-10 12:03:47 | 显示全部楼层
重新分配个一样大小的数组,把不重复的数组存入第2个数组中即可。
  1. #include <stdio.h>

  2. #define MAX 8

  3. int main(void)
  4. {
  5.         char a[MAX] = {'1', '2', '3', '2', '5', '4', '5', '6'};
  6.         char b[MAX] = {'\0'}; // 初始化0
  7.         int i, j;
  8.        
  9.         for(i=0; i<MAX; i++)
  10.         {
  11.                 j=0;
  12.                 while(b[j] != '\0')
  13.                 {                       
  14.                         if (b[j] == a[i])
  15.                                 break;
  16.                         j++;
  17.                 }

  18.                 if (b[j] == '\0')
  19.                         b[j] = a[i];
  20.         }

  21.         for(i=0; i<MAX; i++)
  22.         {
  23.                 printf("%c ", b[i]);
  24.         }
  25.         printf("\n");

  26.        
  27.         return 0;
  28. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-11-10 23:13:50 | 显示全部楼层
检测到相同元素就把之后的所以元素都向前移一位
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-11-10 23:14:26 | 显示全部楼层
检测到相同元素就把之后的所有元素都向前移一位
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-11-11 20:45:20 | 显示全部楼层
本帖最后由 bin554385863 于 2019-11-12 01:41 编辑


看错人了
类似的问题好几个人问,弄混了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-11-12 01:23:31 | 显示全部楼层
本帖最后由 bin554385863 于 2019-11-12 01:41 编辑

MMP
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-11-12 15:44:14 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-11-15 17:30:56 | 显示全部楼层
本帖最后由 jackz007 于 2019-11-15 17:32 编辑
  1. #include <stdio.h>

  2. int del_duplicate(int * d , int n)
  3. {
  4.         int b , e , i , j , k , m                                             ;
  5.         for(m = n , i = 1 ; i < m ; i ++) {
  6.                 b = d[i - 1]                                                  ;
  7.                 for(j = i ; j < m ;) {
  8.                         for(e = 0 ; d[j] == b && j < m ; e ++ , j ++)         ;
  9.                         if(e) {
  10.                                 for(k = j - e ; k < m ; k ++) d[k] = d[k + e] ;
  11.                                 m -= e                                        ;
  12.                         } else {
  13.                                 j ++                                          ;
  14.                         }
  15.                 }
  16.         }
  17.         return m                                                              ;
  18. }

  19. int main(void)
  20. {
  21.         int a[] = {1 , 2 , 3 , 2 , 5 , 4  , 2 , 2 , 2 , 1 , 5 , 6} ;
  22.         int k , n , m                                              ;
  23.         n = 12                                                     ;
  24.         m = del_duplicate(a , n)                                   ;
  25.         for(k = 0 ; k < m ; k ++) printf(" %d" , a[k])             ;
  26.         return 0                                                   ;
  27. }
复制代码


    编译运行实况:
  1. C:\Bin>g++ -o x x.c

  2. C:\Bin>x
  3. 1 2 3 5 4 6
  4. C:\Bin>
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-11-19 16:36:00 | 显示全部楼层
遍历过一个没访问的字符后,用一个标志位记为1,后面的字符访问时,如果碰到标志位为1.就删除,时间复杂度O(n)。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-11-21 17:41:52 | 显示全部楼层
ba21 发表于 2019-11-10 12:03
重新分配个一样大小的数组,把不重复的数组存入第2个数组中即可。

老哥,这一步不太懂,  char b[MAX] = {'\0'}; // 初始化0。初始化o是什么意思,数组b里是元素0吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-11-21 18:23:34 | 显示全部楼层
Jjkkll987987 发表于 2019-11-21 17:41
老哥,这一步不太懂,  char b[MAX] = {'\0'}; // 初始化0。初始化o是什么意思,数组b里是元素0吗

初始化 零 不懂?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-12-1 20:05:57 | 显示全部楼层
ba21 发表于 2019-11-21 18:23
初始化 零 不懂?

晓得了,这是字符串数组,才学到数字数组
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-12-2 17:17:11 | 显示全部楼层
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <malloc.h>
  4. void func(char *str)
  5. {
  6.     size_t sz = strlen(str), s = 0;
  7.     for (size_t i = 0; i < sz; i++)
  8.     {
  9.         for (size_t j = 0; j < i; j++)
  10.         {
  11.             if (str[i] < str[j])
  12.             {
  13.                 char t = str[j];
  14.                 *(str + j) = str[i];
  15.                 *(str + i) = t;
  16.             }
  17.         }
  18.     }
  19.     char *tmp = (char*)malloc(sizeof(char)*(sz + 1));
  20.     tmp[sz] = '\0';
  21.     for (size_t i = 0; i < sz; i++)
  22.     {
  23.         if (str[i] != str[i + 1])
  24.         {
  25.             *(tmp + s) = str[i];
  26.             s++;
  27.         }
  28.     }
  29.     strcpy(str, tmp);
  30.     free(tmp);

  31. }
  32. int main(int argc, char const *argv[])
  33. {
  34.     char str[] = "9988774455666aaa6332ddddf###%^%###210";
  35.     printf("源字符串: %s\n", str);
  36.     func(str);
  37.     printf("去重之后: %s", str);
  38.     return 0;
  39. }

复制代码

===============================================
Microsoft Windows [版本 10.0.18363.476]
(c) 2019 Microsoft Corporation。保留所有权利。

E:\Users\admin\Documents\VScode\Code>c:\Users\admin\.vscode\extensions\ms-vscode.cpptools-0.26.1\debugAdapters\bin\WindowsDebugLauncher.exe --stdin=Microsoft-MIEngine-In-mcljrnk1.wqr --stdout=Microsoft-MIEngine-Out-whpecix3.2dx --stderr=Microsoft-MIEngine-Error-mjixho3t.n42 --pid=Microsoft-MIEngine-Pid-gocqnrb3.nuk --dbgExe=D:\MinGW\bin\gdb.exe --interpreter=mi
源字符串: 9988774455666aaa6332ddddf###%^%###210
去重之后: #%0123456789^adf

E:\Users\admin\Documents\VScode\Code>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-12-3 15:20:58 | 显示全部楼层
本帖最后由 笨小孩丶 于 2019-12-3 15:24 编辑

#include <stdio.h>
#include <conio.h>
int main()
{
    int a[10]={1, 2, 3, 4, 5, 5, 6, 4, 3, 8};
    int b[10];
    int i,j,count=1,num=0;
    b[0]=a[0];
    while(count<10)
       {
          for(i=0;i<count;i++)
          {
              if(a[count]== b )
              {
                  num++;
                  break;
              }
              else
              {
                  continue;
              }
          }
          if(i==count)
          {
              b[count-num]=a[count];
          }
          count++;
       }
    for (j=0;j<count-num;j++)
    {
        printf("%d ",b[j]);
    }
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-20 02:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表