【问题描述】[数组中的重复数字][简单]

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

【解答思路】

1. 排序后比较

时间复杂度:O(NlogN) 空间复杂度:O(1)

class Solution {public int findRepeatNumber(int[] nums) {Arrays.sort(nums);for(int i=0;i<nums.length-1;i++){if(nums[i]==nums[i+1]){return nums[i];}}return -1;}
}
2. HashSet

时间复杂度:O(N) 空间复杂度:O(N)

public int findDuplicate(int[] nums) {HashSet<Integer> set = new HashSet<>();for (int i = 0; i <= nums.length - 1; i++) {if (set.contains(nums[i])) {return nums[i];}else{set.add(nums[i]);}}return -1;
}
3.原地置换


时间复杂度:O(N) 空间复杂度:O(1)

class Solution {public int findRepeatNumber(int[] nums) {int i = 0;while(i < nums.length) {if(nums[i] == i) {i++;continue;}if(nums[nums[i]] == nums[i]) return nums[i];int tmp = nums[i];nums[i] = nums[tmp];nums[tmp] = tmp;
//nums[nums[i]], nums[i] = nums[i], nums[nums[i]],为什么这里的交换可以让元素的 索引 与 值 相等。//下面供大家方便看出来(因为我看了好久才反应过来)://记num[ i ] =a,num[num[ i ] ]=num[ a ]=b,那么 交换后,num[ i ]=b, num[num[i]]=num[a]=a,这时候下标 a 对应的元素也是a,达到目的}return -1;}
}

【总结】

1.考察的是程序员的沟通能力,先问面试官要时间/空间需求
  • 时间优先就用字典,
  • 有空间要求,就用指针+原地排序数组
  • 要求空间O(1)并且不能修改原数组,还得写成二分法
2.灵活思路 一题多解
3. HashMap 或 HashSet常见用法

3.1 HashSet

新建 HashSet<Integer> set = new HashSet<>();

(1)增加
public boolean add(E e);
(2)删除
public boolean remove(Object j);
(3)对比查找
public boolean contains(Object j);
(4)清空集合
public void clear();
(5)获取长度
public int size();
3.2 HashMap

新建 HashMap<String,Integer> map= new HashMap<String,Integer>();

(1) 插入键值对数据
public V put(K key, V value)
(2)根据键值获取键值对值数据
public V get(Object key)
(3)获取Map中键值对的个数
public int size()
(4)判断Map集合中是否包含键为key的键值对
public boolean containsKey(Object key)
(5)判断Map集合中是否包含值为value的键值对
boolean containsValue(Object value)
(6)判断Map集合中是否没有任何键值对
public boolean isEmpty()
(7)清空Map集合中所有的键值对
public void clear()
(8)根据键值删除Map中键值对
public V remove(Object key)

[剑指offer][JAVA]面试题第[03]题[数组中的重复数字][HashSet]相关推荐

  1. [剑指offer][JAVA]面试题第[39]题[数组中出现次数超过一半的数字][HashMap][摩尔投票法]

    [问题描述][简单] 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.你可以假设数组是非空的,并且给定的数组总是存在多数元素.示例 1:输入: [1, 2, 3, 2, 2, 2, 5, ...

  2. 数组中其余的排除_[leetcode 剑指offer系列] 面试题04. 二维数组中的查找

    题目难度: 简单 原题链接 今天继续更新剑指 offer 系列, 这道题的优化空间非常大, 个人感觉很适合作为面试题, 值得一做. 大家在我的公众号"每日精选算法题"中的聊天框中回 ...

  3. [剑指offer][JAVA]面试题第[31]题[栈的压入、弹出序列][栈]

    [问题描述][中等] 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4 ...

  4. [剑指offer][JAVA]面试题第[32-3]题[从上到下打印二叉树 ][BFS]

    [问题描述][中等] 请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推. 例如: 给定二叉树: [3 ...

  5. [剑指offer][JAVA]面试题第[32-2]题[从上到下打印二叉树][BFS]

    [问题描述][简单] 从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行.例如: 给定二叉树: [3,9,20,null,null,15,7],3/ \9 20/ \15 7 ...

  6. [剑指offer][JAVA]面试题第[32-1]题[从上到下打印二叉树][BFS]

    [问题描述][中等] 从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印. 例如: 给定二叉树: [3,9,20,null,null,15,7],3/ \9 20/ \15 7 返回: ...

  7. [剑指offer][JAVA]面试题第[30]题[包含min函数的栈][双栈辅助栈][单栈]

    [问题描述][中等] 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min.push 及 pop 的时间复杂度都是 O(1).示例:MinStack min ...

  8. [剑指offer][JAVA]面试题第[16]题[数值的整数次方][位运算][二分法]

    [问题描述][中等] 实现函数double Power(double base, int exponent),求base的exponent次方.不得使用库函数,同时不需要考虑大数问题.示例 1:输入: ...

  9. [剑指offer][JAVA]面试题第[64]题[求1+2+…+n][逻辑运算符]

    [问题描述][中等] 求 1+2+...+n ,要求不能使用乘除法.for.while.if.else.switch.case等关键字及条件判断语句(A?B:C).输入: n = 3 输出: 6 [解 ...

最新文章

  1. 操作系统就是一个“死循环”?
  2. c打开指定路径文件_C++ 读取指定路径下所有的文件 (C++ get the list of files in a directory)...
  3. 修改mysql数据库名方法_安全快速修改Mysql数据库名的5种方法
  4. Spring整合Mybatis-完成用户登录
  5. 基础、语法都不是最重要的,学Python最重要的是什么?编程思路!
  6. 还在买白酒?算法工程师们,量化投资了解一下
  7. 论文首页下划线怎么对齐_毕业论文标准格式要求是什么样的?
  8. 学术词汇 | Ablation Test or Ablation Experiment
  9. 美国最受欢迎的电商网站,竟然是一家中国公司?
  10. 【AC军团周报(第一周)第一篇】线段树从入门到入土【1】
  11. matlab图像拼接_FPGA大赛【四】具体模块设计图像缓存
  12. X-UA-Compatible IE=edge,chrome=1
  13. centos 7 yum命令安装 Nginx、PHP 7、MySQL 57 、redis
  14. 计算机二级office题库文档,二级office题库
  15. python怎么弄成黑色背景图片_python 实现将小图片放到另一个较大的白色或黑色背景图片中...
  16. 数据链路层——MAC地址欺骗及泛洪
  17. 宽带和流量是分开的吗_带宽与宽带的区别。
  18. 【JD的一人戏】之小羊踢足球第一篇
  19. 在操作系统、芯片领域跌倒的中国程序员,如何崛起?
  20. 【翻译】Matching Restaurant Menus to Crowdsourced Food Data【KDD 2017】

热门文章

  1. What means the error-message 'java.lang.OutOfMemoryError: GC overhead limit exceeded' in Java?
  2. 真人拳皇项目第六次Scrum总结——史经浩
  3. 在虚拟机中安装和配配置 MOSS2007 全过程
  4. C# MVC的博客开发(二)登录
  5. Android 播放raw文件夹下音频文件,本地MP3文件播放,播放云端MP3文件,获取MP3文件播放时长
  6. AppTheme 属性详解
  7. Android 集成微信分享2,实现微信分享
  8. 从mysql 5.7 到 mysql 8.0
  9. tk-mapper 生成器
  10. Mdi和修改的基本逻辑