今天给你们带来的是一道剑指offer上的题目,也是一道很经典的题目,常常在面试中出现,下面咱们来看一下题目描述吧java
题目说明:在一个长度为 n 的数组 nums 里的全部数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每一个数字重复了几回。请找出数组中任意一个重复的数字。面试
示例 1:算法
输入: [2, 3, 1, 0, 2, 5, 3] 输出:2 或 3数组
题目解析:该题题意很容易理解,只须要找出数组中的某一重复出现的数字便可。markdown
排序遍历法:spa
咱们今天主要经过三种作法解决该题,第一种方法咱们能够先对其排序,而后进行遍历当发现重复元素时咱们直接返回该元素便可,这种方法比较容易理解,也比较容易实现,你们能够试一下。code
class Solution {
public int findRepeatNumber(int[] nums) {
Arrays.sort(nums);//排序
//循环遍历
for(int i = 1; i<nums.length ;i++){
//若是相等则返回
if(nums[i] == nums[i-1]){
return nums[i];
}
}
return -1;
}
}
复制代码
哈希表:orm
第二种方法就是借助咱们的哈希表,遍历数组,利用哈希表存储遇到过的数字,若是哈希表已经存储过该数字则直接返回便可。这种方法也比较简单。视频
下面咱们来看代码吧排序
class Solution {
public int findRepeatNumber(int[] nums) {
HashSet<Integer> arr = new HashSet<>();
for(int num:nums){
//若是已经存在则返回
if(arr.contains(num)){
return num;
}
//不存在则存入
arr.add(num);
}
return 0;
}
}
复制代码
原地置换:
下面咱们看一下这个原地置换法,原地置换的整体思路就是将咱们的元素放到他的索引位置。咱们能够这样理解,每一个人都有本身的位置,咱们须要和别人调换回到属于本身的位置,调换以后,若是发现咱们的位置上有人了,并且还和你同样则返回。大体意思了解了,下面咱们代码的执行过程吧。
题目代码:
class Solution {
public int findRepeatNumber(int[] nums) {
for(int i = 0;i < nums.length;i++){
//将当前索引下的元素归位
while(nums[i] != i){
//发现相同数字,返回
if(nums[i] == nums[nums[i]]){
return nums[i];
}
//将当前索引下的数字放到属于他的位置,具体过程参考视频视频
int temp = nums[i];
nums[i] = nums[temp];
nums[temp] = temp;
}
}
return -1;
}
}
复制代码
你们若是能感受到这个文章写的很用心的话,能给您带来一丢丢帮助的话,能麻烦您给这个文章点个赞吗?这样我就巨有动力写下去啦
你们须要更多经典题目的动图详解能够关注公众号:袁厨的算法小屋,更多精选算法题等着你呀,原创不易,感谢观看