重磅乾貨,第一時間送達
程序員
數組中重複的數字面試
在一個長度爲n的數組裏的全部數字都在0到n-1的範圍內。數組中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每一個數字重複幾回。請找出數組中任意一個重複的數字。例如,若是輸入長度爲7的數組{2,3,1,0,2,5,3},那麼對應的輸出是第一個重複的數字2。正則表達式
題目要求中能夠發現,須要找出數組中重複的數字,長度爲n的數組中一定存在元素是重複的!那麼確定是須要記錄數組元素出現的次數,一遇到2立馬跳出便可。因此咱們須要額外的內存來記錄,這個時候你想到使用什麼樣的數據結構?算法
咱們拋開這道題,假設如今題目沒有告訴你數組中是否存在元素重複,那假設如今利用剛剛題目的思路下來,當n較大的時候可能複雜度較高了。數組
個人想法就是將數組和集合結合下,先看看有沒有重複。不知道小夥伴們有沒有其餘更好的思路?微信
用哈希表(字典)將出線的次數進行存儲
PS:其實能夠不用擴展內存來解這道題的。數據結構
# -*- coding:utf-8 -*- class Solution: # 這裏要特別注意~找到任意重複的一個值並賦值到duplication[0] # 函數返回True/False def duplicate(self, numbers, duplication): # write code here if numbers==None or len(numbers)<=1: return False usedDic=set() #集合 for i in range(len(numbers)): if numbers[i]<0 or numbers[i]>len(numbers)-1: return False if numbers[i] not in usedDic: usedDic.add(numbers[i]) else: duplication[0]=numbers[i] return True return False
bool duplicate(int numbers[], int length, int* duplication) { int flag = 0; sort(numbers,numbers+length); for(int i = 0; i<length-1; i++){ if(numbers[i] == numbers[i+1]){ * duplication = numbers[i]; flag = 1; } } if(flag == 0) {* duplication = -1; return false;} if(flag == 1) return true; }
public boolean duplicate(int numbers[],int length,int [] duplication) { if (length < 2 || numbers == null) { return false; } // 是否有重複值 boolean isSuccess = false; HashMap<Integer, Integer> map = new HashMap<>(); for (int i = 0; i < length; i++) { if (!map.containsKey(numbers[i])) { map.put(numbers[i], 1); } else { int b = map.get(numbers[i]); map.put(numbers[i], b+1); isSuccess = true; } } for (int i = 0; i < length; i++) { if (map.get(numbers[i]) > 1){ duplication[0] = numbers[i]; return isSuccess; } } return isSuccess; }
作法2:假設如今不能使用額外的空間進行運算。機器學習
從頭至尾掃描數組的每一個數字,當掃描到下標爲i的數字時,首先比較這個數字(假設爲m)是否等於i,若是是,接着掃描下一個數字;若是不是,那麼再將它和下標爲m的數字對比,若是二者不相等,就把它和第m個數字交換,把m放到屬於它的位置,若是二者相等,那麼就找到了一個重複的數字。重複這個過程,知道發現一個重複的數字。ide
根據代碼分析複雜度:全部操做都在輸入數組上進行,不須要額外分配空間,所以空間複雜度爲O(1);儘管代碼中有一個兩重循環,可是每一個數字最多隻要交換兩次就能找到它本身的位置,由於總的時間複雜度爲O(n)函數
# -*- coding:utf-8 -*- class Solution: # 這裏要特別注意~找到任意重複的一個值並賦值到duplication[0] # 函數返回True/False def duplicate(self, numbers, duplication): # write code here if numbers==None or len(numbers)<=1: return False for i in range(len(numbers)): if numbers[i]<0 or numbers[i]>len(numbers)-1: return False for i in range(len(numbers)): while (numbers[i]!=i): if numbers[i]==numbers[numbers[i]]: duplication[0]=numbers[i] return True else: temp=numbers[i] numbers[i]=numbers[temp] numbers[temp]=temp return False
注:面試季來了,無論是做爲面試者仍是之後做爲面試官,瞭解算法這門程序員之間的溝通方式都是很是必要的。找過工做的朋友應該都據說過《劍指offer》,雖然書中只有六十多道題目,可是道道都是經典。
若是是單純的面試需求,劍指offer的優先級確定是在Leetcode以前,總的說它有三個優勢:
它的缺點是:
劍指offer刷題交流羣
掃碼添加微信,必定要備註研究方向+地點+學校+暱稱(如機器學習+上海+上交+湯姆)
▲長按加羣