牛客网刷题 | BC125 序列中整数去重

目前主要分为三个专栏,后续还会添加:

        专栏如下:                 C语言刷题解析       C语言系列文章       我的成长经历

感谢阅读!

初来乍到,如有错误请指出,感谢!


描述

输入n个整数的序列,要求对这个序列进行去重操作。所谓去重,是指对这个序列中每个重复出现的整数,只保留该数第一次出现的位置,删除其余位置。

输入描述:

输入包含两行,第一行包含一个正整数n(1 ≤ n ≤ 1000),表示第二行序列中数字的个数;第二行包含n个整数(范围1~5000),用空格分隔。

输出描述:

输出为一行,按照输入的顺序输出去重之后的数字,用空格分隔。


 为了实现去重并按顺序输出的功能,我们可以采用以下算法:

  1. 读取输入

    • 首先读取整数 n
    • 然后读取 n 个整数存储在一个数组中。
  2. 去重逻辑

    • 使用一个辅助数据结构来记录已经遇到的数字。
    • 遍历数组中的每个数字,如果该数字尚未被记录,则将其添加到结果列表中,并标记为已处理。
  3. 输出结果

    • 按照原始顺序输出结果列表中的数字。

选择合适的数据结构

对于去重操作,可以选择使用一个布尔数组或哈希表来记录已经遇到的数字。由于题目中提到整数范围在1到5000之间,使用布尔数组是最简单且高效的选择。

  • 布尔数组
    • 创建一个大小为5001的布尔数组 seen,初始值为 false
    • 对于每个读取到的数字 x,检查 seen[x] 是否为 false
    • 如果是 false,则将该数字添加到结果列表中,并将 seen[x] 设置为 true

实现算法

根据上述设计,我们可以编写如下代码:

#include <stdio.h>
#include <stdbool.h>int main() {int n;scanf("%d", &n);int arr[n];bool seen[5001] = {false}; // 用于记录每个数字是否出现过for (int i = 0; i < n; i++) {scanf("%d", &arr[i]);}for (int i = 0; i < n; i++) {if (!seen[arr[i]]) {printf("%d ", arr[i]);seen[arr[i]] = true;}}return 0;
}

验证输出

最后,我们需要验证输出结果是否正确。通过上述步骤,我们已经实现了去重并按顺序输出的功能。让我们通过一些示例来验证我们的算法:

示例 1:

输入:

5
1 2 3 2 1

 输出:

1 2 3 

解释:

  • 数字 1 和 2 出现了两次,但只输出一次。
  • 数字 3 只出现了一次,直接输出。

示例 2:

输入:

7
10 20 30 40 50 60 70

 输出:

10 20 30 40 50 60 70 

解释:

  • 所有数字都不同,直接输出。

错误示例 

输入描述:

  • 输入包含两行。
  • 第一行包含一个正整数 n(1 ≤ n ≤ 1000),表示第二行序列中数字的个数。
  • 第二行包含 n 个整数(范围1~5000),用空格分隔。

输出描述:

  • 输出为一行,按照输入的顺序输出去重之后的数字,用空格分隔。
原始代码分析

原始代码存在以下几个问题:

  1. 输入部分:只读取了一个整数 a,但没有读取后续的 a 个整数。
  2. 去重逻辑:逻辑不正确,无法实现去重功能。
  3. 输出部分:输出方式不当,不能正确输出去重后的数字。

以下是原始代码:

#include <stdio.h>int main() {int a, b, i, arr[50] = {0};scanf("%d", &a);for (i = 0; i < a; i++){printf("%d", arr[i]);}for(int i = 0;i < a;i++){int c = arr[0];c++;if(c++ == arr[i]){arr[i] = 0;}}if(arr[i] != 0){printf("%d ",arr[i]);}return 0;
}

错误分析

  1. 输入部分

    • 问题:代码只读取了一个整数 a,表示数组长度,但没有读取后续的 a 个整数。
    • 原因:缺少读取输入数字的循环。
    • 影响:数组 arr 中的所有元素都是默认初始化的 0,而不是实际输入的数字。
  2. 去重逻辑

    • 问题:去重逻辑不正确,无法实现去重功能。
    • 原因
      • 变量 c 被初始化为 arr[0],即 0
      • c++ 和 if(c++ == arr[i]) 的逻辑混乱,导致无法正确识别和标记重复的数字。
      • 即使 c 能够正确递增,条件判断也不正确。
    • 影响:数组中的元素没有被正确地去重。
  3. 输出部分

    • 问题:输出方式不当,不能正确输出去重后的数字。
    • 原因
      • 在第一个 for 循环中,直接输出了未初始化的数组元素(全部为 0)。
      • 第二个 for 循环结束后,i 已经超出数组范围,arr[i] 是无效的。
      • 最后一个 if 条件检查的是无效的数组索引,可能导致未定义行为。
    • 影响:输出结果不符合题目要求,可能包含不必要的 0 或其他无效数据。

具体错误点

  1. 缺少读取输入数字的循环

for (i = 0; i < a; i++) {printf("%d", arr[i]);
}
  • 这段代码只是简单地打印了数组 arr 中的初始值(全部为 0),并没有从标准输入读取实际的数字。

去重逻辑错误

for(int i = 0; i < a; i++) {int c = arr[0];c++;if(c++ == arr[i]) {arr[i] = 0;}
}

变量 c 初始化为 arr[0]c 被初始化为 0,并且在每次循环中都被重新赋值为 0

  • c++ 和 if(c++ == arr[i]) 的逻辑混乱
    • c++ 首先返回 c 的当前值,然后自增。
    • if(c++ == arr[i]) 意味着 c 的当前值等于 arr[i] 时,c 自增一次,然后与 arr[i] 比较。这种逻辑会导致 c 的值不断变化,无法正确识别和标记重复的数字。
  • arr[i] = 0 的作用:即使 c 能够正确递增,条件判断也不正确,因此这个操作也不会达到预期的效果。

输出部分错误

if(arr[i] != 0) {printf("%d ", arr[i]);
}

输出部分错误

if(arr[i] != 0) {printf("%d ", arr[i]);
}
  • i 已经超出数组范围:第二个 for 循环结束后,i 的值为 a,超出了数组的有效索引范围 [0, a-1]
  • arr[i] 是无效的:访问越界内存可能导致未定义行为或程序崩溃。
  • 最后一个 if 条件检查无效:由于 i 超出范围,arr[i] 不是一个有效的数组元素,因此这个条件检查没有任何意义。

总结

通过上述分析,我们可以看到原始代码存在多个严重的问题:

  • 缺少读取输入数字的循环。
  • 去重逻辑混乱且不正确。
  • 输出部分存在越界访问和无效条件检查。

 步骤 1:正确读取输入

首先,我们需要正确读取输入的 n 个整数。这可以通过一个循环来实现。

#include <stdio.h>int main() {int n;scanf("%d", &n);int arr[n];for (int i = 0; i < n; i++) {scanf("%d", &arr[i]); // 读取输入的数字}// 后续处理...return 0;
}
步骤 2:实现去重逻辑

我们需要遍历数组,对于每个未被标记为已处理过的元素,打印出来,并将所有相同的后续元素标记为已处理。

我们可以使用一个简单的标记方法:将已经处理过的元素标记为 -1

 

#include <stdio.h>int main() {int n;scanf("%d", &n);int arr[n];for (int i = 0; i < n; i++) {scanf("%d", &arr[i]); // 读取输入的数字}for (int i = 0; i < n; i++) {if (arr[i] != -1) { // 检查是否已经处理过printf("%d ", arr[i]);for (int j = i + 1; j < n; j++) {if (arr[j] == arr[i]) {arr[j] = -1; // 标记重复的数字}}}}return 0;
}
步骤 3:验证输出

最后,我们需要确保输出结果是正确的。通过上述步骤,我们已经实现了去重并按顺序输出的功能。

 

#include <stdio.h>int main() {int n;scanf("%d", &n);int arr[n];for (int i = 0; i < n; i++) {scanf("%d", &arr[i]); // 读取输入的数字}for (int i = 0; i < n; i++) {if (arr[i] != -1) { // 检查是否已经处理过printf("%d ", arr[i]);for (int j = i + 1; j < n; j++) {if (arr[j] == arr[i]) {arr[j] = -1; // 标记重复的数字}}}}return 0;
}

更多方法

  1. 读取输入
    • 首先读取整数 n
    • 然后读取 n 个整数存储在一个数组中。
  2. 去重逻辑
    • 使用一个简单的标记方法来记录已经处理过的数字。
    • 遍历数组中的每个数字,如果该数字尚未被标记,则将其添加到结果列表中,并标记为已处理。
  3. 输出结果
    • 按照原始顺序输出结果列表中的数字。

选择合适的数据结构

对于去重操作,可以选择使用一个布尔数组或哈希表来记录已经遇到的数字。然而,在本例中,我们选择了更简单的方法——使用数组元素自身的值来进行标记。具体来说,我们将重复的数字标记为 -1

#include <stdio.h>int main() {int n;scanf("%d", &n);int arr[n];for (int i = 0; i < n; i++) {scanf("%d", &arr[i]); // 读取输入的数字}for (int i = 0; i < n; i++) {if (arr[i] != -1) { // 检查是否已经处理过printf("%d ", arr[i]);for (int j = i + 1; j < n; j++) {if (arr[j] == arr[i]) {arr[j] = -1; // 标记重复的数字}}}}return 0;
}

 去重逻辑

for (int i = 0; i < n; i++) {if (arr[i] != -1) { // 检查是否已经处理过printf("%d ", arr[i]);for (int j = i + 1; j < n; j++) {if (arr[j] == arr[i]) {arr[j] = -1; // 标记重复的数字}}}
}

外层循环 for (int i = 0; i < n; i++) 遍历数组中的每个元素。

  • 如果当前元素 arr[i] 不等于 -1,则表示该元素尚未被处理过。
  • 打印当前元素 printf("%d ", arr[i]);
  • 内层循环 for (int j = i + 1; j < n; j++) 从当前元素的下一个位置开始检查是否有重复的元素。
  • 如果找到重复的元素 if (arr[j] == arr[i]),则将其标记为 -1,表示该元素已经被处理过

输出结果

  • 在外层循环中,如果当前元素 arr[i] 不等于 -1,则打印该元素,并继续处理下一个元素。
  • 这样可以确保按照输入的顺序输出去重后的数字。

输入:

深色版本

5
1 2 3 2 1

输出:

1 2 3 

解释:

  • 数字 1 和 2 出现了两次,但只输出一次。
  • 数字 3 只出现了一次,直接输出。

  

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【一文概述】常见的几种内外网数据交换方案介绍

一、内外网数据交换的核心需求 内外网数据交换的需求核心在于“安全、效率、合规”&#xff0c;而应用场景的多样性使得不同企业需要定制化的解决方案。通过结合业务特性和安全等级要求&#xff0c;企业能够选择适合的技术方案来实现高效、安全的内外网数据交换。 1、数据安全…

记:排查设备web时慢时快问题,速度提升100%

问题描述 问题1&#xff1a; 发现web登录界面刷新和登录功能都比较卡&#xff0c;开浏览器控制台看了下&#xff0c;让我很惊讶&#xff0c;居然能这么慢&#xff1a; 公司2个局域网内的表现不同&#xff0c;局域网A中的都比较卡&#xff0c;局域网B中的又不存在该现象。 问…

简单的Java小项目

学生选课系统 在控制台输入输出信息&#xff1a; 在eclipse上面的超级简单文件结构&#xff1a; Main.java package experiment_4;import java.util.*; import java.io.*;public class Main {public static List<Course> courseList new ArrayList<>();publi…

环境和工程搭建

1.案例介绍 1.1 需求 实现⼀个电商平台 该如何实现呢? 如果把这些功能全部写在⼀个服务⾥, 这个服务将是巨⼤的. 巨多的会员, 巨⼤的流量, 微服务架构是最好的选择. 微服务应⽤开发的第⼀步, 就是服务拆分. 拆分后才能进⾏"各⾃开发" 1.2 服务拆分 拆分原则 …

港科夜闻 | 香港科大与荷兰代尔夫特理工大学(TU Delft)建立合作伙伴关系,推动艺术科技教育与研究...

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、香港科大与荷兰代尔夫特理工大学(TU Delft)建立合作伙伴关系&#xff0c;推动艺术科技教育与研究。2024年12月6日&#xff0c;合作伙伴计划正式启动&#xff0c;双方期望透过合作加强艺术科技知识交流&#xff0c;借此推…

电脑游戏运行时问题解析:《Geometry Dash》DLL文件损坏的原因与解决方案

电脑游戏运行时问题解析&#xff1a;《Geometry Dash》DLL文件损坏的原因与解决方案 在探索《Geometry Dash》这款节奏明快、充满挑战的几何世界冒险游戏时&#xff0c;我们或许会遇到一些令人头疼的技术问题&#xff0c;其中之一便是DLL文件损坏。DLL&#xff08;动态链接库&…

爬虫逆向学习(十四):分享一下某数通用破解服务开发经验

阅前须知 这篇博客不是教大家怎么实现的&#xff0c;而且告知大家有这个东西&#xff0c;或者说一种趋势&#xff0c;借此分享自己大致的实现经验。具体的实现我也不好整理&#xff0c;毕竟是在别人的基础上缝缝补补。 前言 使用补环境方式破解过某数的同学都知道&#xff0…

Maven 的下载

目录 1、Maven 官方地址2、下载3、解压4、配置本地仓库 1、Maven 官方地址 https://maven.apache.org/ 2、下载 3、解压 将下载的压缩包解压到任意位置 4、配置本地仓库 在 Maven 的安装目录下新建文件夹&#xff0c;用来当作 Maven 的本地仓库 进入 conf 目录下&#xff…

【HarmonyOS】鸿蒙应用实现手机摇一摇功能

【HarmonyOS】鸿蒙应用实现手机摇一摇功能 一、前言 手机摇一摇功能&#xff0c;是通过获取手机设备&#xff0c;加速度传感器接口&#xff0c;获取其中的数值&#xff0c;进行逻辑判断实现的功能。 在鸿蒙中手机设备传感器ohos.sensor (传感器)的系统API监听有以下&#xf…

《拉依达的嵌入式\驱动面试宝典》—C/CPP基础篇(三)

《拉依达的嵌入式\驱动面试宝典》—C/CPP基础篇(三) 你好,我是拉依达。 感谢所有阅读关注我的同学支持,目前博客累计阅读 27w,关注1.5w人。其中博客《最全Linux驱动开发全流程详细解析(持续更新)-CSDN博客》已经是 Linux驱动 相关内容搜索的推荐首位,感谢大家支持。 《拉…

统一身份安全管理体系的业务协同能力

随着集团企业数字化组织转型深化&#xff0c;各组织机构间业务协同程度提升。研发业务协同、数据驱动生产决策等数字化生产协作工作体系得以展开&#xff0c;企业内数据流转加快。企业对统一身份安全管理体系的业务协同管理和支撑能力要求提升&#xff1a; 统一身份管理流程需…

华为HarmonyOS NEXT 原生应用开发:鸿蒙中组件的组件状态管理、组件通信 组件状态管理小案例(好友录)!

文章目录 组件状态管理一、State装饰器1. State装饰器的特点2. State装饰器的使用 二、Prop装饰器&#xff08;父子单向通信&#xff09;1. Prop装饰器的特点2. Prop装饰器的使用示例 三、Link装饰器&#xff08;父子双向通信&#xff09;1. Link装饰器的特点3. Link使用示例 四…

CoolEdit详细使用和安装教程

Cool Edit Pro主要用于音频录制、编辑、混音和后期处理。Cool Edit Pro 的特点包括&#xff1a; 音频编辑&#xff1a;支持多轨编辑&#xff0c;可以同时处理多个音频文件&#xff0c;支持精确的音频剪切、复制、粘贴等操作。 录音功能&#xff1a;内置强大的录音功能&#xf…

如何量化管理研发团队的技术债务?

在探讨技术债的成因之前&#xff0c;我们需要澄清一些关于技术债起因和本质的普遍误解。 误解一&#xff1a;技术债务等同于劣质代码 那么&#xff0c;什么构成了所谓的「劣质代码」&#xff1f; 所谓的好代码&#xff0c;可能是指那些整洁、不会在未来限制你决策的代码&…

使用layui的table提示Could not parse as expression(踩坑记录)

踩坑记录 报错图如下 原因&#xff1a; 原来代码是下图这样 上下俩中括号都是连在一起的&#xff0c;可能导致解析问题 改成如下图这样 重新启动项目&#xff0c;运行正常&#xff01;

代理 IP 行业现状与未来趋势分析

随着互联网的飞速发展&#xff0c;代理 IP 行业在近年来逐渐兴起并成为网络技术领域中一个备受关注的细分行业。它在数据采集、网络营销、隐私保护等多个方面发挥着重要作用&#xff0c;其行业现状与未来发展趋势值得深入探讨。 目前&#xff0c;代理 IP 行业呈现出以下几个显著…

泷羽Sec学习笔记-zmap搭建炮台

zmap搭建炮台 zmap扫描环境&#xff1a;kali-linux 先更新软件库 sudo apt update 下载zmap sudo apt install zmap 开始扫描(需要root权限) sudo zmap -p 80 -o raw_ips.txt 代码解析&#xff1a; sudo&#xff1a;以超级用户&#xff08;管理员&#xff09;权限运行…

Introduction to NoSQL Systems

What is NoSQL NoSQL database are no-tabular非數據表格 database that store data differently than relational tables 其數據的存儲方式與關係型表格不同 Database that provide a mechanism機制 for data storage retrieval 檢索 that is modelled in means other than …

规则引擎(一)-技术要点

本文是规则引擎的第一篇&#xff0c;首先介绍规则引擎的技术要点&#xff0c;系列后续文章大纲 1. 事实 事实是规则的依据&#xff0c;来源于业务&#xff0c;或是业务实体&#xff0c;或是多个业务实体的汇集 2. 项目 描述规则的项目结构&#xff1b;KIE核心api&#xff1b;s…

redis集群 服务器更换ip,怎么办,怎么更换redis集群的ip

redis集群 服务器更换ip&#xff0c;怎么办&#xff0c;怎么更换redis集群的ip 1、安装redis三主三从集群2、正常状态的redis集群3、更改redis集群服务器的ip 重启服务器 集群会down4、更改redis集群服务器的ip 重启服务器 集群down的原因5、更改redis集群服务器的ip后&#xf…