111升学论坛

 找回密码
 加入家园
专业、学校怎么选?免费公益咨询解答开通学校版块微信:543646没考上高中怎么办,不要慌!
热门:大连报关学校招生网增加印象分,实用新型专利包过申请发明专利申请并不难,代写全部材料,轻松申请!
查看: 836|回复: 14

面试官:如何迅速找出数组中重复的数字?

[复制链接]

42

主题

40

回帖

238

积分

中级会员

Rank: 3Rank: 3

积分
238
发表于 2021-2-17 21:21:43 | 显示全部楼层 |阅读模式
集群智慧云科服发明专利申请
推荐阅读:

  • 消息队列面试,你能顶得住面试官这波10大连环炮的攻势吗?
  • 三次阿里二面挂,Java+并发+JVM+网络+数据库+算法,我还能说啥?
  • 性能优化专题复习:JVM+Tomcat+MySQL+面试+学习笔记等
at1xKjKMK8kssJL0.jpg



题目

给定一个长度为 n 的整数数组 nums,数组中所有的数字都在 0∼n−1 的范围内。
数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。
请找出数组中任意一个重复的数字。
注意:如果某些数字不在 0∼n−1 的范围内,或数组中不包含重复数字,则返回 -1。
样例
给定 nums = [2, 3, 5, 4, 3, 2, 6, 7]。

返回 2 或 3。解题思路

从题目我们可以知道,数组长度为 n,所有数字都在 0~n-1 范围内。如果元素不重复,那么数组应该就是 [0, 1, 2, ...n-1](假设给数组排完了序)。也就是说,递增排序后,数组中的元素值与其对应的下标应该是相同的,即下标为 0 的元素值也是 0,以此类推。
首先,我们可以遍历数组,若存在元素不在 0~n-1 的范围内,直接返回 -1。
接着,再次遍历数组,若下标 i 与对应元素 nums 不同,即 nums != i,我们应该把 nums 这个元素交换到正确的位置 nums上。交换前,先判断 nums 与 nums[nums] 这两个元素是否相同,相同说明存在重复元素,直接返回,否则进行 swap 交换。交换过后,我们需要再次判断 i 位置上的元素,因此,我们使用 while 循环。
可对照下方代码实现,加深理解。
100% AC 代码
class Solution {
public int duplicateInArray(int[] nums) {
int n = nums.length;

// 若存在数组元素不在[0, n-1] 的范围内,直接返回-1
for (int num : nums) {
if (num < 0 || num >= n) {
return -1;
}
}

for (int i = 0; i < n; ++i) {
while (nums != i) {
if (nums == nums[nums]) {
// 说明位置i与位置nums上的元素相同,直接返回该重复元素
return nums;
}
swap(nums, i, nums);
}
}
return -1;

}

private void swap(int[] nums, int i, int j) {
int t = nums;
nums = nums[j];
nums[j] = t;
}
} _.._ ,------------.
,' `. ( We want you! )
/ __) __` \ `-,----------'
( (`-`(-') ) _.-'
/) \ = / (
/' |--' . \
( ,---| `-.)__`
)( `-.,--' _`-.
'/,' ( Uu",
(_ , `/,-' )
`.__, : `-'/ /`--'
| `--' |
` `-._ /
\ (
/\ . \. offer
/ |` \ ,-\
/ \| .) / \
( ,'|\ ,' :
| \,`.`--"/ }
`,' \ |,' /
/ "-._ `-/ |
"-. "-.,'| ;
/ _/["---'""]
: / |"- '
' | /
` |

作者:yanglbme
原文链接:https://juejin.im/post/5dd29e1f5188254a1f446545

回复

使用道具 举报

18

主题

23

回帖

137

积分

新手上路

Rank: 1

积分
137
发表于 2021-2-17 21:26:00 | 显示全部楼层
转发了
回复

使用道具 举报

51

主题

55

回帖

340

积分

中级会员

Rank: 3Rank: 3

积分
340
发表于 2021-2-17 21:30:17 | 显示全部楼层
转发了
回复

使用道具 举报

24

主题

47

回帖

186

积分

新手上路

Rank: 1

积分
186
发表于 2021-2-17 21:34:34 | 显示全部楼层
刚问了老婆,说用hashmap,遍历一遍,存入到map,每个元素作为key,而value为先从key取出并+1的结果。再遍历一次,取出key的value,大于等于2的就是重复的[捂脸]
回复

使用道具 举报

25

主题

75

回帖

319

积分

中级会员

Rank: 3Rank: 3

积分
319
发表于 2021-2-17 21:38:51 | 显示全部楼层
这出题错了,面试官应该是想考异或的用法,所以要加上条件:找出只有一个重复的数
回复

使用道具 举报

36

主题

71

回帖

360

积分

中级会员

Rank: 3Rank: 3

积分
360
发表于 2021-2-17 21:43:08 | 显示全部楼层
都排序好了,判断相邻两个元素num,num[i+1]是否相等不就得了。这样效率如何?
回复

使用道具 举报

29

主题

60

回帖

287

积分

中级会员

Rank: 3Rank: 3

积分
287
发表于 2021-2-17 21:47:25 | 显示全部楼层
数组求和然后减去0到n-1的和,差就是重复的数
回复

使用道具 举报

41

主题

92

回帖

413

积分

中级会员

Rank: 3Rank: 3

积分
413
发表于 2021-2-17 21:51:42 | 显示全部楼层
两种方法,第一种时间复杂度为O(1),空间复杂度为O(N),使用哈希表可以解决。第二种时间复杂度为O(N),空间复杂度为O(1),从0到N中间如果有重复,也必然存在一个环,通过双指针法找到环的入口即可,如果没有则不存在
回复

使用道具 举报

30

主题

52

回帖

257

积分

中级会员

Rank: 3Rank: 3

积分
257
发表于 2021-2-17 21:55:59 | 显示全部楼层
转List用java8的lambda表达式
回复

使用道具 举报

39

主题

47

回帖

296

积分

中级会员

Rank: 3Rank: 3

积分
296
发表于 2021-2-17 22:00:16 | 显示全部楼层
直接group by搞定
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入家园

本版积分规则

QQ|Archiver|手机版|小黑屋|111升学论坛

GMT+8, 2024-12-28 03:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表