牛客——不重复数字(哈希表、平衡树)

今天的第二题。下面这道题呢有两种解法,一种基于哈希表,一种基于平衡树。

登录—专业IT笔试面试备考平台_牛客网
 

题目描述

给出N个数,要求把其中重复的去掉,只保留第一次出现的数。 

例如,给出的数为1 2 18 3 3 19 2 3 6 5 4,其中2和3有重复,去除后的结果为1 2 18 3 19 6 5 4。  

输入描述:

输入第一行为正整数T,表示有T组数据。
接下来每组数据包括两行,第一行为正整数N,表示有N个数。
第二行为要去重的N个正整数。

输出描述:

对于每组数据,输出一行,为去重后剩下的数字,数字之间用一个空格隔开。

示例1

输入

2
11
1 2 18 3 3 19 2 3 6 5 4
6
1 2 3 4 5 6

输出

1 2 18 3 19 6 5 4
1 2 3 4 5 6

        这道题使用哈希表(Hash Table)算法来实现去重操作。具体而言,我们使用了unordered_set来存储已经出现过的数,利用该数据结构的特性,可以快速判断一个数是否已经存在于集合中。通过遍历输入的数列,将每个数添加到哈希表中,并判断是否已经存在,从而实现去重操作。

        在C++中,unordered_set是哈希表的实现之一,而unordered_map则是实现哈希表的关联容器。这两个容器都是C++标准库提供的,用于存储无序的键值对。在本题中,我们只需要记录数的出现情况,因此选择使用unordered_set来实现哈希表。

下面是向 unordered_set 插入和删除元素的示例代码:

#include <iostream>
#include <unordered_set>

int main() {
    std::unordered_set<int> mySet;

    // 插入元素
    mySet.insert(10);
    mySet.insert(20);
    mySet.insert(30);

    // 使用范围构造函数插入元素
    std::unordered_set<int> otherSet = {40, 50, 60};
    mySet.insert(otherSet.begin(), otherSet.end());

    // 删除元素
    mySet.erase(20);  // 删除值为 20 的元素

    // 遍历元素
    for (int num : mySet) {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    return 0;
}

本题哈希表解法代码为:

#include <iostream>
#include <unordered_set>
#include <vector>

void removeDuplicates(const std::vector<int>& nums) {
    std::unordered_set<int> seen;
    std::vector<int> result;

    for (int i=0;i<nums.size();i++) {
        if (seen.find(nums[i]) == seen.end()) {
            result.push_back(nums[i]);
            seen.insert(nums[i]);
        }
    }

    for (int num : result) {
        std::cout << num << " ";
    }
    std::cout << std::endl;
}

int main() {
    int t;
    std::cin >> t;

    while (t--) {
        int n;
        std::cin >> n;

        std::vector<int> nums(n);
        for (int i = 0; i < n; i++) {
            std::cin >> nums[i];
        }

        removeDuplicates(nums);
    }

    return 0;
}
​
#include <iostream>
#include <unordered_set>
#include <vector>
#include <iostream>
using namespace std;
int main() {
    int T;
    cin >> T;

    while (T--) {
        int N;
        cin >> N;

        vector<int> nums(N);
        for (int i = 0; i < N; i++) {
            cin >> nums[i];
        }

        unordered_set<int> uniqueNums;
        for (int i=0;i<nums.size();i++) {
            uniqueNums.insert(nums[i]);
        }

        for (int i=0;i<nums.size();i++) {
            if (uniqueNums.count(nums[i]) > 0) {
                cout << nums[i] << " ";
                uniqueNums.erase(nums[i]);
            }
        }
        cout << endl;
    }

    return 0;
}

​

平衡树和哈希表是两种不同的数据结构,在解决去重问题时可以使用它们来实现相同的功能,但它们的实现细节和性能特点有所不同。

平衡树(如红黑树、AVL树)是一种自平衡的二叉搜索树,它保持树的高度平衡,可以在O(log N)的时间复杂度内进行插入、查找和删除操作。平衡树的主要优点是可以保持元素的有序性,且插入和删除操作相对较快。因此,使用平衡树来解决去重问题时,可以保持去重后的元素有序。

哈希表是一种基于哈希函数的数据结构,通过将关键字映射到哈希表中的位置来进行查找和插入操作。哈希表的主要优点是查找和插入操作的平均时间复杂度为O(1),即常数时间。哈希表的缺点是无法保持元素的有序性,且在存在哈希冲突时,可能需要处理冲突的情况。

对于去重问题,平衡树和哈希表的做法可以达到相同的去重效果,但它们的实现方式和性能特点有所不同。平衡树适用于需要保持元素有序性的场景,而哈希表适用于查找和插入操作频繁的场景,并且不需要保持有序性。

本题平衡树解法:

#include <iostream>
#include <set>
#include <vector>

int main() {
    int T;
    std::cin >> T;

    while (T--) {
        int N;
        std::cin >> N;

        std::vector<int> nums(N);
        for (int i = 0; i < N; i++) {
            std::cin >> nums[i];
        }

        std::set<int> uniqueNums;
        for (int num : nums) {
            if (uniqueNums.find(num) == uniqueNums.end()) {
                uniqueNums.insert(num);
                std::cout << num << " ";
            }
        }
        std::cout << std::endl;
    }

    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

接口测试要测试什么?怎么测?

本文主要分为两个部分&#xff1a; 第一部分&#xff1a;主要从问题出发&#xff0c;引入接口测试的相关内容并与前端测试进行简单对比&#xff0c;总结两者之前的区别与联系 第二部分&#xff1a;主要介绍为什么要做接口测试&#xff0c;并简单总结接口持续集成和接口质量评估…

Java调用百度翻译API和调用有道翻译API进行翻译

目录 界面编写 调用百度API 调用有道API 源代码 界面编写 我们首先需要设计出这个翻译程序的GUI界面&#xff0c;我们写一个类继承自JFrame类&#xff0c;用来展示程序的主窗口&#xff0c;设置好窗口的名称和大小&#xff0c;设置在关闭窗口时终止程序&#xff0c;为了界…

React Native:入门知识了解

什么是React Native React Native&#xff08;简称RN&#xff09;是Facebook于2015年4月开源的跨平台移动应用开发框架&#xff0c;是Facebook早先开源的JS框架 React 在原生移动应用平台的衍生产物&#xff0c;目前支持iOS和安卓两大平台。React Native使用Javascript语言&am…

功能更新|免费敏捷工具Leangoo领歌私有部署新增第三方身份认证和API对接

Leangoo领歌是一款永久免费的专业的敏捷开发管理工具&#xff0c;提供端到端敏捷研发管理解决方案&#xff0c;涵盖敏捷需求管理、任务协同、进展跟踪、统计度量等。 Leangoo支持敏捷研发管理全流程&#xff0c;包括小型团队敏捷开发&#xff0c;规模化敏捷SAFe&#xff0c;Scr…

windows数据备份方法

信息时代数据已成为个人及企业的重要资产&#xff0c;数据丢失或者损坏会带来无法弥补的损失。数据安全主要关注两个方面数据容灾和数据备份。容灾的目的是防止硬件发生错误&#xff0c;通过多个相同或类似硬件避免单一硬件故障造成的数据丢失。数据备份除了可以防止单一硬件错…

使用QT基于YMODEM协议实现串口文件发送(和xshell互通)

背景 项目需要用QT实现一个YMODEM文件传输的功能&#xff0c;目标下位机是MCU嵌入式设备&#xff0c;且下位机程序已经经过xshell传输文件的验证。 YMODEM 简介 YMODEM协议是一个文件传输协议&#xff0c;常用于嵌入式设备。本文不对YMODEM做过多的阐述&#xff0c;阅读需建…

Tomcat主配置文件(server.xml)详解

前言 Tomcat主配置文件&#xff08;server.xml&#xff09;是Tomcat服务器的主要配置文件&#xff0c;文件位置在conf目录下&#xff0c;它包含了Tomcat的全局配置信息&#xff0c;包括监听端口、虚拟主机、安全配置、连接器等。 目录 1 server.xml组件类别 2 组件介绍 3 se…

003 FeedForward前馈层

一、环境 本文使用环境为&#xff1a; Windows10Python 3.9.17torch 1.13.1cu117torchvision 0.14.1cu117 二、前馈层原理 Transformer模型中的前馈层&#xff08;Feed Forward Layer&#xff09;是其关键组件之一&#xff0c;对于模型的性能起着重要作用。下面将用900字对…

cpp:1:10: fatal error: opencv2/core.hpp: 没有那个文件或目录

前言&#xff1a; 我按照官网方法安装了opencv&#xff0c;运行的也是官网的测试代码&#xff1a; #include <opencv2/core.hpp> #include <opencv2/highgui.hpp> using namespace cv; int main() {printf("hello world")return 0; }

boost1.55 安装使用教程 windows

第一步 &#xff1a;首先在boost官网上下载库压缩包 添加链接描述 选择自己需要的版本进行下载 解压后执行booststrap.bat 用来生成创建b2.exe 和bjam.exe 拓展&#xff1a;.\b2 --help 了解一下有哪些参数可以配置 默认b2.exe编译后&#xff0c;链接到项目如果出现如下错误…

VLAN基本原理

目录 一、VLAN概念及优势 &#xff08;一&#xff09;基本理念 &#xff08;二&#xff09;VLAN的特点 二、VLAN ID 种类、范围及用途 &#xff08;一&#xff09;静态VLAN &#xff08;二&#xff09;动态VLAN &#xff08;三&#xff09;VLAN三种端口类型 &#xff0…

深入理解Java虚拟机---类加载机制

类加载机制 什么是类加载机制类加载的时机类加载的过程加载验证文件格式验证元数据验证字节码验证符号引用验证 准备解析初始化 类加载器双亲委派模型 什么是类加载机制 虚拟机把描述类的数据从 Class 文件加载到内存&#xff0c;并对数据进行校验、转换解析和初始化&#xff…

centOS安装bochsXshell连接centos启动可视化界面

centOS安装bochs 参考&#xff1a;https://blog.csdn.net/muzi_since/article/details/102559187 首先安装依赖环境&#xff1a; yum install gtk2 gtk2-devel yum install libXt libXt-devel yum install libXpm libXpm-devel yum install SDL SDL-devel yum install libXr…

已解决:No goals have been specified for this build. You must specify a vali

[ERROR] No goals have been specified for this build. You must specify a valiTOC 完整报错 No goals have been specified for this build. You must specify a valid lifecycle phase or a goal in the format : or :[:]:. Available lifecycle phases are: pre-clean, c…

6. Service详解

6. Service详解 文章目录 6. Service详解6.1 Service介绍6.2 Service类型6.3 Service使用6.3.1 实验环境准备6.3.2 ClusterIP类型的Service6.3.3 HeadLess类型的Service6.3.3.1 deployment和statefulset区别6.3.3.2 statefulset deployment 区别 6.3.4 NodePort类型的Service6.…

Trace 在多线程异步体系下传递

JAVA 线程异步常见的实现方式有&#xff1a; new ThreadExecutorService 当然还有其他的&#xff0c;比如fork-join&#xff0c;这些下文会有提及&#xff0c;下面主要针对这两种场景结合 DDTrace 和 Springboot 下进行实践。 引入 DDTrace sdk <properties><java.…

湖农大邀请赛shell_rce漏洞复现

湖农大邀请赛 shell_rce 复现 在 2023 年湖南农业大学邀请赛的线上初赛中&#xff0c;有一道 shell_rce 题&#xff0c;本文将复现该题。 题目内容&#xff0c;打开即是代码&#xff1a; <?phpclass shell{public $exp;public function __destruct(){$str preg_replace…

Shopify怎么避免被封店?封店原因有哪些?

市场研究的一份报告显示&#xff0c;全球跨境电子商务市场预计到2028年将达到30422亿美元&#xff0c;其中&#xff0c;亚太地区是最大的跨境电商市场&#xff0c;据海关统计数据&#xff0c;近五年来&#xff0c;我国跨境电商进出口增长近10倍。跨境电商业务新的增长风口已经到…

图像去噪——PMRID训练自己数据集及推理测试(详细图文教程)

目录 一、源码包准备二、数据集准备2.1 提取数据集名称2.2 .txt报错问题2.2.1 正确格式2.2.2 错误格式 三、修改配置参数四、训练及保存模型权重4.1 训练4.2 保存模型权重文件 五、模型推理测试5.1 导入测试集5.2 测试5.3 测试结果5.3.1 测试场景15.3.2 测试场景2 5.4 推理速度…

jsp+servlet+图书交流平台 有filter过滤器

在线图书推荐与交流平台 随着数字化的进展和人们对持续学习的追求&#xff0c;在线资源变得越来越受欢迎。对于众多读者来说&#xff0c;找到合适的书籍和与其他读者交流阅读体验是非常有价值的。为了满足这一需求&#xff0c;我们提出了一个在线图书推荐与交流平台的设计。此…