劍指 03 題目二 不修改陣列找出重複的數字

2021-10-25 18:02:29 字數 1379 閱讀 2610

其他好的解法

測試用例

獲得的思考

在乙個長度為n+1的陣列裡的所有數字都在1~n範圍內,所以陣列中至少有乙個數字重複。找出乙個重複的數字但不能修改原陣列

示例:

輸入:
輸出:2或3
本題是這道題的延伸,劍指 03 陣列中重複的數字

既然給出了陣列長度,第乙個念頭還是想到雜湊法,與上面題中**基本一致,需要修改的就是構造的雜湊表大小應為n+1,並且因為範圍在1~n內,所以雜湊表的第乙個位置必然是0,**如下:

class

solution

}return res;}}

;

使用輔助空間,空間複雜度為o(n)

劍指書上給了一種二分法方案。比如要是沒有重複數字,在[1, n]的範圍內就只有n個數。假設m是[1, n]中間的數,統計[1, m]內數字(1、2、… m)在陣列中的出現的次數count,如果count > m,說明[1, m]內存在重複數字;再將[1, m]分成兩份,統計每份數字在陣列**現的次數,如此到最後兩個數,分別統計這兩個數在陣列**現的次數。

亮點:

傳統的二分法是針對有序陣列來使用的,但是這個二分法是通過查詢已知範圍的陣列元素在亂序陣列**現的次數為前提使用的。

//統計傳入區間[start, end]的數字在傳入陣列**現的次數,返回該次數

intcountrange

(const

int* numbers,

int length,

int start,

int end)

//返回重複數字

intgetduplication

(const

int* numbers,

int length)

if(count > middle - start +1)

//重複數字在左區間,切換終點到中間

end = middle;

else

//重複數字在右區間,切換起點到中間+1,因為是左閉右閉區間

start = middle +1;

}return-1

;//處理異常情況,正確情況的返回值已經在上面if語句中,這裡必須有乙個顯式return

}

以往筆者的測試用例都很基礎,只實現了特定功能,沒有考慮對異常情況(無效輸入、與題目要求相反的的輸入)的處理。劍指書上列的三種測試用例都值得借鑑。

擼**之前一定要先構造測試用例,增加魯棒性,再完成基本要求後考慮其他異常情況。

劍指offer題目 不修改陣列找出重複的數字

沒有在牛客網的oj上找到這個題目所以寫在部落格裡記錄一下 題目 在乙個長度為n 1的陣列裡的所有數字都在1 n的範圍內,所以陣列中至少有乙個數字是重複的。請找出陣列中任意乙個重複的數字,但不能修改輸入的陣列。例如,如果輸入長度為8的陣列,那麼對應的輸出是重複的數字2或者3.題目中說了不能改變輸入的陣...

劍指Offer 不修改陣列找出重複的數字

在乙個長度為n 1的陣列裡,所有的數字都在1 n的範圍內,所以陣列中至少有乙個數字是重複的 因為長度為n 1,而1 n只有n個數字,也就是說就算每個數字不一樣,都會空餘乙個位置,所以至少有乙個重複的數字 請找出陣列中任意乙個重複的數字,但是不能修改輸入的陣列。例如,如果輸入長度為8的陣列,那麼對應輸...

劍指offer 不修改陣列找出重複的數字go語言版

題目描述 給定乙個長度為n 1的陣列nums,陣列中所有的數均在1 n 的範圍內,其中 n 1。請找出陣列中任意乙個重複的數,但不能修改輸入的陣列。樣例給定 nums 2,3,5,4,3,2,6,7 返回 2 或 3。思考題 如果只能使用 o 1 的額外空間,該怎麼做呢?題目思路 該題目主要使用二分...