题目描述

找出数组中重复的数字。

在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。

示例 1:

输入:

[2, 3, 1, 0, 2, 5, 3]

输出:2 或 3

限制:

2 <= n <= 100000

Java

  1. import java.util.HashSet;
  2. import java.util.Set;
  3. class Solution {
  4. public static void main(final String[] args) {
  5. final Solution solution = new Solution();
  6. final int[] nums = new int[] { 2, 3, 1, 0, 2, 5, 3 };
  7. System.out.println(solution.findRepeatNumber(nums));
  8. System.out.println(solution.findRepeatNumber2(nums));
  9. }
  10. /**
  11. * 方法一:遍历数组
  12. *
  13. * 遍历数组中的每个元素: * 将该元素加入集合中,判断是否加入成功 * 添加失败,则找到重复数字
  14. *
  15. * 时间复杂度 O(n) 空间复杂度 O(n)
  16. *
  17. * @param nums
  18. * @return
  19. */
  20. public int findRepeatNumber(final int[] nums) {
  21. Set<Integer> set = new HashSet<>();
  22. int repeat = -1;
  23. for (final int num : nums) {
  24. if (!set.add(num)) {
  25. repeat = num;
  26. break;
  27. }
  28. }
  29. return repeat;
  30. }
  31. /**
  32. * 方法二:原地置换
  33. * 注意所有数字都在 0~n-1 的范围内
  34. * @param nums
  35. * @return
  36. */
  37. public int findRepeatNumber2(final int[] nums) {
  38. int len = nums.length;
  39. int temp = 0;
  40. for (int i = 0; i < len; i++) {
  41. if (nums[i] != i) {
  42. if (nums[i] == nums[nums[i]]) {
  43. return nums[i];
  44. } else {
  45. temp = nums[i];
  46. nums[i] = nums[temp];
  47. nums[temp] = temp;
  48. }
  49. }
  50. }
  51. return -1;
  52. }
  53. }

C++

  1. #include<iostream>
  2. #include<vector>
  3. using namespace std;
  4. class Solution {
  5. public:
  6. int findRepeatNumber(vector<int>& nums) {
  7. int len = nums.size();
  8. int temp = 0;
  9. for (int i = 0; i < len; ++i) {
  10. if (nums[i] != i) {
  11. if (nums[i] == nums[nums[i]]) {
  12. return nums[i];
  13. } else {
  14. temp = nums[i];
  15. nums[i] = nums[temp];
  16. nums[temp] = temp;
  17. }
  18. }
  19. }
  20. return -1;
  21. }
  22. };
  23. int main() {
  24. auto s = new Solution();
  25. vector<int> v = {2, 3, 1, 0, 2, 5, 3};
  26. cout << s->findRepeatNumber(v) << endl;
  27. delete s;
  28. }

Python

  1. from __future__ import annotations
  2. from typing import List
  3. class Solution:
  4. def findRepeatNumber(self, nums: List[int]) -> int:
  5. size = len(nums)
  6. temp = 0
  7. for index, value in enumerate(nums):
  8. if value != index:
  9. if value == nums[value]:
  10. return value
  11. else:
  12. temp = value
  13. value = nums[temp]
  14. nums[temp] = temp
  15. return -1
  16. if __name__ == "__main__":
  17. s = Solution()
  18. print(s.findRepeatNumber([2, 3, 1, 0, 2, 5, 3]))

总结

【剑指 Offer】03.数组中重复的数字的更多相关文章

  1. 剑指 Offer 03. 数组中重复的数字

    剑指 Offer 03. 数组中重复的数字 找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知 ...

  2. 菜鸟刷题路:剑指 Offer 03. 数组中重复的数字

    剑指 Offer 03. 数组中重复的数字 哈希表/set class Solution { public int findRepeatNumber(int[] nums) { HashSet< ...

  3. 5.1 剑指 Offer 03. 数组中重复的数字

    类型题:剑指 Offer 03. 数组中重复的数字 找出数组中重复的数字.在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了, ...

  4. 【剑指Offer】数组中重复的数字 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 解题方法 Set 快慢指针 日期 题目地址:https://leetcod ...

  5. Go语言实现:【剑指offer】数组中重复的数字

    该题目来源于牛客网<剑指offer>专题. 在一个长度为n的数组里的所有数字都在0到n-1的范围内.数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组 ...

  6. (python)剑指Offer:数组中重复的数字

    问题描述 在长度为n的数组中,所有的元素都是0到n-1的范围内. 数组中的某些数字是重复的,但不知道有几个重复的数字,也不知道重复了几次,请找出任意重复的数字. 例如,输入长度为7的数组{2,3,1, ...

  7. 剑指Offer 50. 数组中重复的数字 (数组)

    题目描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为 ...

  8. 剑指offer:数组中重复的数字

    题目描述: 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度 ...

  9. [剑指Offer] 50.数组中重复的数字

    题目描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为 ...

  10. 【剑指offer】数组中重复的数字

    题目描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为 ...

随机推荐

  1. kubernetes集群断电后etcd启动失败之etcd备份方案

    一.问题描述 二进制部署的单Master节点的v1.13.10版本的集群,etcd部署的是3.3.10版本,部署在master节点上.在异常断电后,kubernetes集群无法正常启动.这里通过查看k ...

  2. 关于VS.Net应用的图标提取方法

    .Net的资源文件 VS.Net 支持三种文件类型的resource:.txt..resx..resources. system.resources 名字空间支持三种资源文件: txt 文件,只能有字 ...

  3. AtCoder Regular Contest 109

    Contest Link 为什么还没有 Official Editorial 啊--哦,原来是日文题解,那没事了. A - Hands 有两幢 100 层的楼房 \(A,B\) ,将地面所在的楼层称为 ...

  4. Codeforces Edu Round 48 A-D

    A. Death Note 简单模拟,可用\(\%\)和 \(/\)来减少代码量 #include <iostream> #include <cstdio> using nam ...

  5. Acwing 120. 防线

    题目地址 题目简译:给定\(n\)个等差数列,每个等差数列的起点为\(s\),终点为\(e\),差为\(d\).整个序列中至多有一个位置所占数字是奇数.判断奇数位是否存在,如果不存在输出"T ...

  6. 计算机网络——HTTP知识点整理

    1.HTTP简介 HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传送协议.它可以使浏览器更加高效,使网络传输减少.它 ...

  7. STL——容器(deque)deque 的删除 clear() erase()

    deque.clear(); //移除容器的所有数据 1 #include <iostream> 2 #include <deque> 3 4 using namespace ...

  8. 史上最全单链表的增删改查反转等操作汇总以及5种排序算法(C语言)

    目录 1.准备工作 2.创建链表 3.打印链表 4.在元素后面插入元素 5.在元素前面增加元素 6.删除链表元素,要注意删除链表尾还是链表头 7.根据传入的数值查询链表 8.修改链表元素 9.求链表长 ...

  9. 网站配置Gittalk教程和解决gittalk的Error: Not Found.问题

    想把网站增加gittalk的评论功能,按照其他教程配置后,出现了 Error: Not Found. 的错误.截图如下: 网上找了很多解决方案,现在贴出来完整的配置Gittalk的教程. 01.新建评 ...

  10. [OI笔记]每周刷题记录

    一些题库: bzoj.uoj.luogu(洛谷).CF.loj.hdu.poj.51nod 下面是一些近期的做题记录 省选爆炸-然后大概就先这样了,要回去读一段时间文化课,如果文化课还不错的话也许还会 ...