# 如何寻找缺失和重复的元素
![](../pictures/souyisou.png) 相关推荐: * [手把手带你刷二叉树(第三期)](https://labuladong.gitbook.io/algo) * [25 张图解:键入网址后,到网页显示,其间发生了什么](https://labuladong.gitbook.io/algo) 读完本文,你不仅学会了算法套路,还可以顺便去 LeetCode 上拿下如下题目: [645.错误的集合](https://leetcode-cn.com/problems/set-mismatch) **-----------** 今天就聊一道很看起来简单却十分巧妙的问题,寻找缺失和重复的元素。之前的一篇文章「寻找缺失元素」也写过类似的问题,不过这次的和上次的问题使用的技巧不同。 这是 LeetCode 645 题,我来描述一下这个题目: 给一个长度为 `N` 的数组 `nums`,其中本来装着 `[1..N]` 这 `N` 个元素,无序。但是现在出现了一些错误,`nums` 中的一个元素出现了重复,也就同时导致了另一个元素的缺失。请你写一个算法,找到 `nums` 中的重复元素和缺失元素的值。 ```cpp // 返回两个数字,分别是 {dup, missing} vector======其他语言代码====== [zhuli](https://github.com/1097452462 "zhuli")提供的Java代码: ```java class Solution { public int[] findErrorNums(int[] nums) { int n = nums.length; int dup = -1; for (int i = 0; i < n; i++) { // 元素是从 1 开始的 int index = Math.abs(nums[i]) - 1; // nums[index] 小于 0 则说明重复访问 if (nums[index] < 0) dup = Math.abs(nums[i]); else nums[index] *= -1; } int missing = -1; for (int i = 0; i < n; i++) // nums[i] 大于 0 则说明没有访问 if (nums[i] > 0) // 将索引转换成元素 missing = i + 1; return new int[]{dup, missing}; } } ```