删除数组中重复出现的值

简介: 删除数组中重复出现的值

一、题目描述


我们先来具体描述一下题目所表达的意思:你首先在键盘上输入一个数字,这个数字就是你要输入数字的个数。然后输入一组数据,把这组数据保留在一个数组当中。最后查重,删除掉多次出现多余的数值,最终输出的结果是所有重复的数字只保留第一次出现的那份。


c4c120475f744007bba0e718cda1f335.png


二、思路讲解


 一共写出来四组代码,经过不断的思考,代码是越来越简单。但是前三组的代码思路基本上是相同的,只不过是代码优化了。第四组是另一种思路,也是运行效率最高的一种。

下面是第一组:

这种代码是先把整个数据输入其中。然后再一一查询。


#include<stdio.h>
#define N 100
int main()
{
    int n, i, k, j;
    int arr[N];
    scanf("%d", &n);
    for (i = 0; i < n; i++)
    {
        scanf("%d", &arr[i]);
    }
    for (i = 0; i < n; i++)  //遍历整个数组的数字
    {
        for (j = i ; j < n; j++)  //从当前数字开始与剩余的数字进行比较
        {
            if (arr[j] == arr[i])  //判断之后的数字是否与当前相等
            {
                for (k = j; k < n - 1; k++)  //找到相等的数字后,需要所有的数字前移一位
                {
                    arr[k] = arr[k + 1];
                }
                n--;  //因前移一位,数组的整数个数减一
                j--;  //因循环玩后要执行j++,会跳到下一个数字与剩余的数字比较。但是注意,当前 
                      //的j并没有查找结束,前移一位后面还可能有相同的,需要j--后再j++,相当于 
                      //还是当前j的位置。
            }
        }
        printf("%d ", arr[i]);  //直接打印数组
    }
    return 0;
}


下面是第二组:


 写完第一组代码后,虽然思路是正确的,但是确实运行效率不高,代码较乱、较麻烦、不易理解。于是就开始优化代码。第一组是每个数字都要与后面的比较,效率太低。于是就想到了输入一个,就与前面的比较看是否有重复。相对于第一组的代码,这组的代码是一个一个输入整数进行比较。

#include<stdio.h>
#define N 100
int main()
{
  int n,i,j,flag=1,a=0;
  int arr[N];
  int arr1[N];
  scanf("%d",&n);
  for(i=0;i<n;i++)  //循环n次,输入n个数
  {
    flag=1;  //设置一个标志点。当flag=1时说明没有重复,如果有重复flag=0.
    scanf("%d",&arr[i]);
    for(j=0;j<i;j++)  
    {
      if(arr[j]==arr[i])  //输入的与已有数据比较是否重复
      {
        flag=0;  //重复时flag=0,且不用继续比较
        break;
      }
    }
    if(flag==1)  //跳出for循环后flag=1,说明没有重复。没有重复的数据放入一个新的数组中。
    {
      arr1[a]=arr[i];
      a++;
    }
  }
    for(i=0;i<a;i++)  //打印数组
  {
    printf("%d ",arr1[i]);
  }
  return 0;
}


下面是第三组:

 这一组代码,是在第二组的基础上优化。不再创建新的数组存放。

#include<stdio.h>
#define N 100
int main()
{
  int n,i,j;
  int arr[N];
  scanf("%d",&n);
  for(i=0;i<n;i++)
  {
    scanf("%d",&arr[i]);
    for(j=0;j<i;j++)
    {
      if(arr[j]==arr[i])
      {
        i--;  //如果有重复,这里的i--,代码再次跳到最外层for循环执行i++;相当于i没 
                      //变,直接覆盖上次输入所重复的值。
                break;  //找到重复后就可以直接跳出循环 
      }
    }
  }
    for(i=0;i<a;i++)  //打印数组
  {
    printf("%d ",arr1[i]);
  }
  return 0;
}


下面是第四组:

   这组代码相对于前三组,思路不相同。但是运行效率高了很多。而这组代码的关键就是判断数组。也是因判断数组而大大提高了运行效率。

#define n 10
#include<stdio.h>
int main()
{
    int  i = 1;
    int num[n]; //储存数组
    int judge[n] = { 0 }; //判断重复数组。判断的方法就是:你所要储存输入的数值为该数组下标,一但输入这个数值,以该数值为下标的判断数组的值变成1.以后每输入一个值只需判断以该数值为下标的判断数组中的值是否为1即可。如果不为1,说明没有重复。
    scanf("%d", &num[0]); //输入第一个数值
    printf("%d", num[0]); //打印第一个数值
    judge[num[0]]++;     //以该数值为下标的判断数组的值变成1
    while (i < n)
    {
        scanf("%d", &num[i]);
        if (judge[num[i]] != 0)  //判断以该数值为下标的判断数组中的值是否为1
        {
            printf("%d ", num[i]);  //没有重复,打印出该值
            judge[num[i]]++;  //没有重复后,以该数值为下标的判断数组的值变成1
        }
        i++;
    }
}


三、总结


 数组去重对于初学者来说可能会有一点难,但学到后面我们会发现思路并不是很难,一步一步分析,主要是考虑好各种情况和边界问题。


相关文章
Google Earth Engine(GEE)——导出指定区域的河流和流域范围
Google Earth Engine(GEE)——导出指定区域的河流和流域范围
727 0
|
6月前
|
API C++
【Azure Developer】VS Code上登录China Azure遇见错误:CAA20002
在VS Code中安装Azure Resource插件后,修改云环境为中国区Azure时,可能会遇到错误代码CAA20002。解决办法是将Microsoft Account的Client ID Version从默认的v1修改为v2。具体操作为:打开VS Code设置页面“Setting”,输入“microsoft account”过滤配置,在Microsoft中找到Client ID Version并将其值更改为v2。完成后测试登录即可成功。相关参考资料可查阅GitHub上的VS Code Azure登录问题讨论。
138 7
|
10月前
|
数据采集 存储 安全
Pandas数据类型转换:astype与to_numeric
在数据分析中,Pandas的`astype`和`to_numeric`是两种常用的数据类型转换方法。`astype`可将DataFrame或Series中的数据转换为指定类型,支持单一列或多列转换;常见问题包括无效字面量和精度丢失。`to_numeric`主要用于字符串转数值,容错能力强,能自动识别缺失值并优化内存占用。掌握这两种方法及其错误处理技巧,可提高数据分析的效率与准确性。
565 23
|
存储 SQL 关系型数据库
深入解析MySQL事务机制和锁机制
深入解析MySQL事务机制和锁机制
|
编译器 C++
C++ max函数与min函数
C++ max函数与min函数
637 0
macbookpro触摸板突然失灵按压无震动反馈和回弹感
macbookpro触摸板突然失灵按压无震动反馈和回弹感
931 0
|
机器学习/深度学习 算法 测试技术
C++算法:深度优先搜索(BFS)的原理和实现
C++算法:深度优先搜索(BFS)的原理和实现
|
资源调度 分布式计算 Hadoop
bigdata-09-Yarn原理与实战
bigdata-09-Yarn原理与实战
246 0
|
SQL 运维 数据管理
sql管理工具archery简介
Archery是一个多公司采用的SQL管理工具,提供权限管理、工作流配置、实例管理、SQL审核、查询、优化及通知功能。它支持多级审批和不同云环境的数据管理。尝试Archery的SaaS版本可访问[ArcheryDMS.com](https://archerydms.com/home/)。此外,NineData是一个综合平台,包含SQL开发、数据复制等功能,适应混合云和多云环境,由叶正盛创建,详情见[Ninedata.cloud](https://www.ninedata.cloud/aboutus)。
782 0