删除重复数字的三种方法(详解)

news2024/7/31 3:41:53

前言:本期是关于去重数字的三种方法详解,今天你c了吗?

输入描述:

第一行,输入一个整数n,表示序列有n个整数。

第二行输入n个整数(每个整数大于等于1,小于等于1000),整数之间用空格分隔。

输出描述:

去重并且从小到大排列的整数序列,整数之间用空格分隔。

示例1

输入:

6
5 3 3 4 2 2

输出:

2 3 4 5

方法一:覆盖法(暴力求解)

代码实现:

 int main()
{
    int n = 0;
    scanf("%d", &n);
    int i = 0;
    int arr[1000] = { 0 };
    for (i = 0; i < n; i++)
    {
        scanf("%d", &arr[i]);
    }
    //冒泡排序
    for (i = 0; i < n - 1; i++)
    {
        int j = 0;
        for (j = 0; j < n - 1 - i; j++)
        {
            if (arr[j] > arr[j + 1])
            {
                int tmp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = tmp;
            }
        }
    }
    //去重
    for (i = 0; i < n - 1; i++)
    {
        if (arr[i] == arr[i + 1])
        {
            int k = 0;
            for (k = i; k < n - 1; k++)
            {
                arr[k] = arr[k + 1];
            }
            n--;
            i--;
        }
    }
    //打印
    for (i = 0; i < n; i++)
    {
        printf("%d ", arr[i]);
    }
    return 0;
}

思路:

 1. 将无序数组变成有序数组(这里使用冒泡排序,点击即跳转我另一篇博客的详解)

 2. 两两进行比较,若是二者值相同,则出现了重复数字,用后者覆盖前者,覆盖后相当于删除了一个重复数字,数字个数-1 

 3. 需要对新覆盖上来的数字再和它后一位数字进行比较,比如出现连续3个及以上的重复数字

代码解读:详解去重部分

已经实现过数组排序

   for (i = 0; i < n - 1; i++)
    {
        if (arr[i] == arr[i + 1])
        {
            int k = 0;
            for (k = i; k < n - 1; k++)
            {
                arr[k] = arr[k + 1];
            }
            n--;
            i--;
        }
    }

 以如下为例

示例1

输入:

6
5 3 3 4 2 2

输出:

2 3 4 5

1.数字之间两两比较,6个数字共需比较5次,故而n个数字,需比较n-1次

   这里的for循环用于实现比较的次数

 for (i = 0; i < n - 1; i++)

      

2.for循环内部:两个数字之间的一次比较

        if (arr[i] == arr[i + 1])
        {
            int k = 0;
            for (k = i; k < n - 1; k++)
            {
                arr[k] = arr[k + 1];
            }
            n--;
            i--;
        }

      若是两个数字相同,则出现重复数字,需要去重,用后者覆盖前者

      如  5 3 3 4 2 2,经过前面的冒泡排序后,变成:2 2 3 3 4 5

      假设现在比较的是2 2 两个数字,需要进行去重,操作如下:

       从第二个2开始的全部数字往前移动一位

       移动完成后删重成功,数字个数-1

      注意特殊情况:出现连续的3个及以上的重复数字,如 2 2 2 3 3 4 5

                               第一个2和第二个2经过去重后,数组变成:2 2 3 3 4 5

       原本比较完第一个元素和第二个元素后,下一次是比较第二个元素和第三个元素

       但是第二个元素是2,第三个元素是3,我们漏掉了新的第一个元素2和第二个元素2的比较

       2和3不同,不去重,下一次再比较3和3,进行去重后数组变成:2 2 3 4 5

 故而:我们在每一次去重后,都需要对新覆盖上来的数字(原本是两两比较的重复数字中的第二个数)和它后面的一个数进行再次比较

操作是:i--

形象一点:假设一个数字的下标为2,一个数字的下标为3,此时的i=2,i+1=3

                  本来这轮的两个数字去重后,马上要进行的是下一对的比较

                   在进入下一对的比较之前,i--,相当于退后一步,然后i++,进入下一对比较

                    效果是:先退一步再前进一步=原地不动

                  原本 下一轮要比较的两个数字的下标为3和下标为4,但是在这之前i--(退后一步)

                    i:2-1=1,i变成了下标1,i++,i:1+1=2,此时i还是下标2,又可以对下标为2的数字

                   和下标为3的数字进行再次比较

方法二:简单

代码实现:

int main()
{
    int n = 0;
    scanf("%d", &n);
    int i = 0;
    int arr[1001] = { 0 };
    int input = 0;
    for (i = 0; i < n; i++)
    {
        scanf("%d", &input);
        arr[input] = input;
    }
    for (i = 0; i < 1001; i++)
    {
        if (arr[i] != 0)
        {
            printf("%d ", arr[i]);
        }
    }
    return 0;
}

思路: 

1.将每一个数字作为下标,将其对应的数组空间内置成数字的值

2. 打印数组中不为0的值

如:5 3 3 4 2 2

002345
下标012345

两个重复的数字3和2存入数组中,在下标为3和下标为2的空间中存了一个3和一个2的值

初始化数组的内容全部为0,最后打印不为0的值

方法三:双指针 

双指针详解(我的另一篇博客已有详解,点击即跳转)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/197402.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

关于模板字面量,我有点好奇它的内部结构

前言 最近翻看源码的时候&#xff0c;发现一些有趣的 JS 的知识点&#xff0c;基于日常的开发经验&#xff0c;我做了一些联想和对比。整个过程充满了乐趣。 于是我想&#xff0c;是不是可以延续这种创意带来的学习的乐趣。 带的富含创造力夜晚的 buff&#xff0c;确实让我拥…

一、系统编程常用api

一、文件io文件io是linux系统提供的接口&#xff0c;针对文件和磁盘进行操作&#xff0c;不带缓存机制标准io是c语言函数库里的标准io模型&#xff0c;在stdio.h中定义&#xff0c;通过缓冲区操作文件&#xff0c;带有缓存机制标准 IO 和文件 IO 的区别如下图所示&#xff1a;文…

SSD(固态) VS HDD(机械),购买指南

大多数人买电脑的时候纠结买固态硬盘&#xff08;SSD&#xff09;还是机械硬盘(HDD)。哪个是最佳选择呢&#xff0c;是固态硬盘还是机械硬盘呢&#xff1f;这个问题没有直接的答案&#xff0c;每个购买者有不同的需求&#xff0c; 需要根据需求做选择。这些需求像是性能、和预算…

DS18B20测量温度液晶1602显示

DS18B20温度传感器简介DS18B20是一种数字温度传感器。它输出的是数字信号&#xff0c;同时具有体积小&#xff0c;硬件资源耗费少&#xff0c;抗干扰能力强&#xff0c;精度高等特点。DS18B20温度传感器特点1、单线接口&#xff1a;DS18B20仅需一条线可实现与微处理器双向通信。…

泰山服务器板载 HNS3 网卡绑核无法充分利用 CPU 的解决思路

文章目录前言解决方案排查过程应用程序运行环境与方式检查是否存在 irqbalance 进程检查中断号对应的 CPU 亲和尝试其他绑核方式尝试调整队列数量:核心数量为 2:1前言 前段时间在泰山服务器上进行性能测试&#xff0c;预期是应用进程能够占满机器大部分 CPU。但实际上&#xf…

书城第二阶段——用户注册和登陆

目录0.0 JavaEE 项目的三层架构0.1 项目阶段二&#xff1a;用户注册和登陆的实现。1、先创建书城需要的数据库和表。2、编写数据库表对应的JavaBean对象。3、编写工具类 JdbcUtils3.1、导入需要的 jar 包&#xff08;数据库和连接池需要&#xff09;&#xff1a;3.2、在 src 源…

钉钉一键登录第三方网站

钉钉一键登录第三方网站序钉钉开发者后台H5微应用应用代码开发登录页面login.html登录实现LoginController.javapom.xml增加一键登录效果展示序 企业内部系统已经做过了钉钉扫码登录&#xff0c;现在需要添加钉钉一键登录第三方网站功能&#xff0c;这里主要记录一键登录整个实…

物联网终端设备的工作原理和功能讲解

物联网终端设备是实现数据采集和数据传输的设备&#xff0c;它连接了传感网络层和传输网络层&#xff0c;起到了数据采集、数据处理、数据加密和传输的功能。 物联网终端设备由传感器、外部传感接口、CPU和外部通讯组成&#xff0c;工作原理是通过外部传感接口与传感设备连接&a…

和平精英军需精打细算天花板,330拿下一整套军需

和平精英军需精打细算天花板&#xff0c;330拿下一整套军需&#xff01; #和平精英 #这游戏不花钱 #游戏凡星计划 军需精打细算天花板&#xff0c;一个月时间花 110 块获得 436 个军需币。拿个新军需的副套问题不大。要知道和平小店的暖弄大礼包&#xff0c; 100 左右&#…

一次在 classpath 使用通配符导致的偶发问题排查与建议

说起 Classpath&#xff0c;使用 Java 的同学应该都不会陌生。不过&#xff0c;目前的项目基本都会使用 Maven 等构建工具管理&#xff0c;开发过程中也会使用高度智能化的 IDE&#xff0c;在日常使用中直接涉及 Classpath 操作可能不多。前段时间遇到一个跟 Classpath 相关的偶…

【My Electronic Notes系列——触发器】

目录 序言&#xff1a; &#x1f3c6;&#x1f3c6;人生在世&#xff0c;成功并非易事&#xff0c;他需要破茧而出的决心&#xff0c;他需要永不放弃的信念&#xff0c;他需要水滴石穿的坚持&#xff0c;他需要自强不息的勇气&#xff0c;他需要无畏无惧的凛然。要想成功&…

【栈】单调栈详情介绍及其运用

单调栈单调栈的概述&#xff08;Overview&#xff09;何时使用单调栈模拟单调递增栈单调栈的运用&#xff08;算法练习题&#xff09;模板【练习一、单调栈】739. 每日温度【练习二、单调栈哈希表】496. 下一个更大元素 I【练习三、单调栈循环数组】503. 下一个更大元素 II【练…

Word处理控件Aspose.Words功能演示:使用 C++ 处理 Word 文档中的目录

Aspose API支持流行文件格式处理&#xff0c;并允许将各类文档导出或转换为固定布局文件格式和最常用的图像/多媒体格式。 Aspose.words是一种高级Word文档处理API&#xff0c;用于执行各种文档管理和操作任务。API支持生成&#xff0c;修改&#xff0c;转换&#xff0c;呈现和…

4EVERLAND IPFS CID部署,一键部署Uniswap

近日&#xff0c;4EVERLAND推出IPFS CID部署&#xff0c;开发者可以复制IPFS CID&#xff0c;一键部署到4EVERLAND。 一键部署&#xff0c;无需通过Github Repo&#xff0c;只需要知道CID即可。一键跨平台部署项目到 Arweave 或 ICP。了解IPFS CID&#xff0c;通过4EVERLAND绑…

漫谈广告机制设计 | 开篇语

很久没有写文章了&#xff0c;oCPC实践录的专栏还没有写完&#xff0c;我就换工作了&#xff0c;去了M公司&#xff0c;做的内容与oCPC不怎么相关&#xff0c;对于其中的问题思考也没有那么多了&#xff0c;好在专栏的核心思想已经基本阐明了。在M公司也已经快两年了&#xff0…

青龙+WxPusher实现资产推送

1.首先注册WXpusher&#xff1a; https://wxpusher.zjiecode.com/admin/login 扫码注册创建应用 确定完就会出现一个token&#xff0c;一定先复制保存起来&#xff0c;因为只显示一次&#xff0c;没存后期就只能重置了。 关闭后&#xff0c;这个页面有二维码和链接&#xff0…

CSS定位详解

文章目录定位为什么要使用定位定位的组成定位模式静态定位&#xff1a;按照标准流特性摆放&#xff0c;没有边偏移相对定位&#xff1a;元素在移动位置的时候&#xff0c;是相对于它原来的位置来说的绝对定位&#xff1a;在移动位置的时候相对与祖先元素固定定位&#xff1a;元…

C语言:指针详解

往期文章 C语言&#xff1a;初识C语言C语言&#xff1a;分支语句和循环语句C语言&#xff1a;函数C语言&#xff1a;数组C语言&#xff1a;操作符详解 目录往期文章前言1. 指针是什么2. 指针和指针类型3. 野指针4. 指针运算4.1 指针-整数4.2 指针-指针4.3 指针的关系运算5. 二…

“小灵通”的风雨往事

最近&#xff0c;有一部叫做《狂飙》的国产电视剧火遍全网&#xff0c;相信大家都看到了。在剧中&#xff0c;出现了一个通信名词&#xff0c;不知道在座各位有没有关注到。没错&#xff0c;这个名词&#xff0c;就是“小灵通”。《狂飙》剧的主角高启强&#xff0c;原本是个卖…

Web3.0 · 基础层技术 · SCQA模型趣谈密码学

【小木箱成长营】密码学系列教程&#xff1a; Web3.0 基础层技术 密码学在移动端应用与实践 一、序言 Hello&#xff0c;我是小木箱&#xff0c;欢迎来到小木箱成长营密码学系列教程&#xff0c;今天将分享 Web3.0 基础层技术 SCQA 模型趣谈密码学。 SCQA 模型趣谈密码学主…