今天給你們帶來的是一道劍指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;
}
}
複製代碼
你們若是能感受到這個文章寫的很用心的話,能給您帶來一丟丟幫助的話,能麻煩您給這個文章點個贊嗎?這樣我就巨有動力寫下去啦
你們須要更多經典題目的動圖詳解能夠關注公衆號:袁廚的算法小屋,更多精選算法題等着你呀,原創不易,感謝觀看