首页 > 其他分享 >【剑指offer】- 数组中重复的数字 -48/67

【剑指offer】- 数组中重复的数字 -48/67

时间:2023-05-24 15:02:37浏览次数:52  
标签:HashMap 48 nums ++ offer int num 67 指针


1. 题目描述

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

输入:
[2, 3, 1, 0, 2, 5, 3]
输出:2 或 3

2. 题目分析

  1. 此题考查的是面试者的沟通能力,在面试官给出此题时,要询问面试官允许的时间复杂度和空间复杂度
  2. 关于此题,有三种解法,对应着三种不同的时间空间复杂度:
排序:    时间: O(nlogn)  空间O(1)
HashMap: 时间: O(n) 空间O(n)
根据题目信息,按数值和下标:时间:O(n) 空间: O(1)
  1. 排序的解法:进行快排,然后nums[i] != i,返回nums[i];
  2. HashMap的解法:初次出现时map.put(nums[i], 1); 再一次出现时,直接返回nums[i]
  3. 数值和下标的解法:从下标0开始,将num[i]放在下标为num[i]的位置,如果坐标num[i]的值已经是num[i],则返回num[i];
例如:1 0 2 3 5 2 
当前指针为0
1 != 0 所以将1和0交换 0 1 2 3 4 5 2
0 == 0 指针++
1 == 1 指针++
2 == 2 指针++
3 == 3 指针++
4 == 4 指针++
5 == 5 指针++
2 != 6,但是目前下标2已经有2了,所以2是重复的

3. 题目代码

3.1 HashMap解法

public int findRepeatNumber(int[] nums) {
		HashMap<Integer, Integer> map = new HashMap<>();
		for (int i = 0; i < nums.length; i++) {
			if (map.containsKey(nums[i])) {
				return nums[i];
			} else {
				map.put(nums[i], 1);
			}
		}
		return 0;
	}

3.2 数值与下标

public static int findRepeatNumber1(int[] nums) {
		int i = 0;
		while (i < nums.length) {
			if (nums[i] == i) {
				i++;
				continue; //
			}
			if (nums[i] == nums[nums[i]]) {
				return nums[i];
			}
			// 这里需要注意,在进行交换时,一定要写nums[i] = nums[temp];
			// 不能写成nums[nums[i]] = nums[i]; 因为在第二步时,我们的nums[i]已经被改变
			int temp = nums[i];
			nums[i] = nums[temp];
			nums[temp] = temp;
		}
		// -1:未被查到有重复的
		return -1;
	}


标签:HashMap,48,nums,++,offer,int,num,67,指针
From: https://blog.51cto.com/u_16127529/6340852

相关文章

  • P1748 a+b+c+d==0
    #include<bits/stdc++.h>usingnamespacestd;/**16-452242-16-41-275630-3653-3777-3630-75-4626-38-1062-32-54-645*/intmain(){intn;while(cin>>n){for(inti=0;i<n;i++)......
  • MT6753 (MTk6753)核心板 4G全网通八核安卓开发板
    MT6753(MTk6753)是一款安卓核心板,采用八核Cortex-A53(64Bit)1.3GHZCPU,支持安卓5.1/6.0操作系统,是全球第一款64位8核高性能的4G全网通安卓智能模块。除了支持2G/3G/4G移动、联通、电信等多种网络制式,还支持WiFi/BT/GNSS(GPS/Beidou)/FM。该模块具有丰富的数据接口,包括LCM、C......
  • 图解LeetCode——剑指 Offer 34. 二叉树中和为某一值的路径
    一、题目给你二叉树的根节点root和一个整数目标和targetSum,找出所有从根节点到叶子节点路径总和等于给定目标和的路径。叶子节点是指没有子节点的节点。二、示例2.1>示例1:【输入】root=[5,4,8,11,null,13,4,7,2,null,null,5,1],targetSum=22【输出】[[5,4,11,2],[5,......
  • 图解LeetCode——剑指 Offer 36. 二叉搜索树与双向链表
    一、题目输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。二、示例为了让您更好地理解问题,以下面的二叉搜索树为例:我们希望将这个二叉搜索树转化为双向循环链表。链表中的每个节点都有一个前驱和后继指针。对......
  • 图解LeetCode——剑指 Offer 07. 重建二叉树
    一、题目输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。二、示例2.1>示例1:【输入】preorder=[3,9,20,15,7],inorder=[9,3,15,20,7]【输出】[3,9,20,null,null,15,7]2.2>示例2:【输入】pr......
  • 图解LeetCode——剑指 Offer 29. 顺时针打印矩阵
    一、题目输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。二、示例2.1>示例1:【输入】matrix=[[1,2,3],[4,5,6],[7,8,9]]【输出】[1,2,3,6,9,8,7,4,5]2.2>示例2:【输入】matrix= [[1,2,3,4],[5,6,7,8],[9,10,11,12]]【输出】[1,2,3,4,8,12,11,10,9,5,6,7]限......
  • 图解LeetCode——剑指 Offer 15. 二进制中1的个数
    一、题目编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为'1'的个数(也被称为 汉明重量)。二、示例2.1>示例1:【输入】n=11(控制台输入00000000000000000000000000001011)【输出】3【解释】输入的二进制串000000000000000000000000000010......
  • 剑指 Offer 58 - II. 左旋转字符串
    剑指Offer58-II.左旋转字符串</br></br>题目:字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。示例1:输入:s="abcdefg",k......
  • 剑指 Offer 05. 替换空格
    剑指Offer05.替换空格</br></br>题目:请实现一个函数,把字符串s中的每个空格替换成"%20"。示例:输入:s="Wearehappy."输出:"We%20are%20happy."限制:0<=s的长度<=10000</br></br>思路1:可以通过实例化出一个新的string对象,通过对原来字符串进行遍历,将原字符......
  • 洛谷 P9248 - [集训队互测 2018] 完美的集合
    显然,如果选择的\(k\)个“合法集合”固定了,那么可以放置装置的点如果存在,那么必然形成一个连通块,也就是说,答案等于所有合法方案中,可以放置装置的点形成的连通块个数之和。而根据点减边的套路,这等价于,枚举每个点,计算有多少种方案满足可以在其放置装置,再枚举每条边,计算有多少种方案......