LeetCode面试系列 第11天:No.645 - 错误的集合

简介: LeetCode面试系列 第11天:No.645 - 错误的集合

image.png


上一篇 LeetCode 面试题中,我们分析了一道简单的几何数学题。今天我们来分析一道集合相关的数学题。


image.png


今天要给大家分析的面试题是 LeetCode 上第 645 号问题,

LeetCode - 645. 错误的集合


https://leetcode-cn.com/problems/set-mismatch/


题目描述

集合 S 包含从 1 到 n  的整数。不幸的是,因为数据错误,导致集合里面某一个元素复制了成了集合里面的另外一个元素的值,导致集合丢失了一个整数并且有一个元素重复。

给定一个数组 nums 代表了集合 S 发生错误后的结果。你的任务是首先寻找到重复出现的整数,再找到丢失的整数,将它们以数组的形式返回。

示例 1:



输入: nums = [1,2,2,4]输出: [2,3]


注意:

  1. 给定数组的长度范围是 [2, 10000]。
  2. 给定的数组是无序的。
  • 题目难度:简单
  • 通过次数:7.3K
  • 提交次数:18.5K
  • 贡献者:LeetCode
  • 相关标签
  • 相似题目

解题思路:


由于给定输入是无序的数组,且每个数的范围是 [1, n] ,排序后便于后续处理。

如何得到重复的数


  • 只需要使用 set 中元素互不相等的特性,得到去除重复后的数组
  • 对原数组求和,再对去重后的数组求和,所得两个和的差极为重复的数


如何得到缺失的数


  • 使用一个对比序列 stdList,放有: 1, 2 ... n 等元素 (从 1 到 n)
  • 将原数组转为 set,再将对比序列转为 set。两个 set 的差集中的元素只有一个,取出就是缺失的数。


最后将 **重复的数 **和 缺失的数 一起放进 list 中即可。

AC的代码为:


class Solution:    def findErrorNums(self, nums: List[int]) -> List[int]:        res = list()        nums.sort()        stdList = range(1, len(nums) + 1)  # len(nums) = n        repeatedNum = sum(nums) - sum(set(nums))             res.append(repeatedNum)        missingNum =  (set(stdList) - set(nums)).pop()        res.append(missingNum)        return res


执行用时: 276 ms, 在所有 python3 提交中击败了 60.58 % 的用户.


image.png


示例代码: https://github.com/JustDoPython/leetcode-python/tree/master/leetcode-645


LeetCode面试系列:


第1天:Leetcode 89 - 格雷码

第2天:No.136 - 只出现一次的数

第3天:No.67 - 二进制数求和

第4天:No.202 - 快乐数

第5天:No.204 - 统计质数

第6天:No.9 - 回文数

第7天:No.13 - 罗马数字转整数

第8天:No.58 - 最后一个单词的长度

第9天:No.345 - 反转字符串中的元音字母

第10天:No.976 - 三角形的最大周长

目录
相关文章
|
4月前
|
安全 Java 容器
【Java集合类面试二十七】、谈谈CopyOnWriteArrayList的原理
CopyOnWriteArrayList是一种线程安全的ArrayList,通过在写操作时复制新数组来保证线程安全,适用于读多写少的场景,但可能因内存占用和无法保证实时性而有性能问题。
|
4月前
|
存储 安全 Java
【Java集合类面试二十五】、有哪些线程安全的List?
线程安全的List包括Vector、Collections.SynchronizedList和CopyOnWriteArrayList,其中CopyOnWriteArrayList通过复制底层数组实现写操作,提供了最优的线程安全性能。
|
4月前
|
Java
【Java集合类面试二十八】、说一说TreeSet和HashSet的区别
HashSet基于哈希表实现,无序且可以有一个null元素;TreeSet基于红黑树实现,支持排序,不允许null元素。
|
4月前
|
Java
【Java集合类面试二十三】、List和Set有什么区别?
List和Set的主要区别在于List是一个有序且允许元素重复的集合,而Set是一个无序且元素不重复的集合。
|
4月前
|
Java
【Java集合类面试二十六】、介绍一下ArrayList的数据结构?
ArrayList是基于可动态扩展的数组实现的,支持快速随机访问,但在插入和删除操作时可能需要数组复制而性能较差。
|
4月前
|
存储 Java 索引
【Java集合类面试二十四】、ArrayList和LinkedList有什么区别?
ArrayList基于动态数组实现,支持快速随机访问;LinkedList基于双向链表实现,插入和删除操作更高效,但占用更多内存。
|
2月前
|
存储 安全 算法
Java面试题之Java集合面试题 50道(带答案)
这篇文章提供了50道Java集合框架的面试题及其答案,涵盖了集合的基础知识、底层数据结构、不同集合类的特点和用法,以及一些高级主题如并发集合的使用。
116 1
Java面试题之Java集合面试题 50道(带答案)
|
3月前
|
安全 Java API
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
String常量池、String、StringBuffer、Stringbuilder有什么区别、List与Set的区别、ArrayList和LinkedList的区别、HashMap底层原理、ConcurrentHashMap、HashMap和Hashtable的区别、泛型擦除、ABA问题、IO多路复用、BIO、NIO、O、异常处理机制、反射
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
|
4月前
|
存储 安全 Java
Java集合类面试十七】、介绍一下ConcurrentHashMap是怎么实现的?
ConcurrentHashMap在JDK 1.7中通过分段锁实现线程安全,在JDK 1.8中则采用Node数组配合链表和红黑树,并使用Synchronized和CAS操作提高并发性能。
Java集合类面试十七】、介绍一下ConcurrentHashMap是怎么实现的?
|
4月前
|
Java
【Java集合类面试二十二】、Map和Set有什么区别?
该CSDN博客文章讨论了Map和Set的区别,但提供的内容摘要并未直接解释这两种集合类型的差异。通常,Map是一种键值对集合,提供通过键快速检索值的能力,而Set是一个不允许重复元素的集合。