[英]Java hashset vs Arrays.sort
我正在嘗試解決以下“ codility”練習:
給出了由N個不同整數組成的零索引數組A。 該數組包含[1 ..(N + 1)]范圍內的整數,這意味着恰好缺少一個元素。
您的目標是找到缺少的元素。
編寫一個函數:
class Solution { public int solution(int[] A); }
給定零索引數組A,則返回缺少元素的值。
例如,給定數組A使得:
A[0] = 2
A[1] = 3
A[2] = 1
A[3] = 5
該函數應返回4,因為它是缺少的元素。
假使,假設:
N is an integer within the range [0..100,000];
the elements of A are all distinct;
each element of array A is an integer within the range [1..(N + 1)].
復雜:
expected worst-case time complexity is O(N);
expected worst-case space complexity is O(1), beyond input storage (not counting the storage required for input arguments).
輸入數組的元素可以修改。
我想出了兩種解決方案:
1)給予100%/ 100%
class Solution {
public int solution(int[] A) {
int previous = 0;
if (A.length != 0) {
Arrays.sort(A);
for (int i : A) {
if (++previous != i) {
return previous;
}
}
}
return ++previous;
}
}
2)給出錯誤WRONG ANSWER,預期得到65536 100001
class SolutionHS {
public int solution(int[] A) {
int previous = 0;
HashSet<Integer> hs = new HashSet<>();
if (A.length != 0) {
for (int a : A) {
hs.add(a);
}
for (Integer i : hs) {
if (++previous != i) {
return previous;
}
}
}
return ++previous;
}
}
我的問題是:兩種方法(使用hashset和Arrays.sort)是否應該以相同的方式工作? 如果不能,您能告訴我有什么區別嗎?
HashSet
不會排序,因此,當您遍歷Set的元素時,不會像代碼期望的那樣將它們按升序排列。 如果使用TreeSet
而不是HashSet
,則代碼將起作用。
如果將第二個循環更改為: HashSet
解決方案將給出正確的答案:
for (int i = 0; i <= A.length; i++) {
if (!hs.contains(i)) {
return i;
}
}
此循環顯式檢查相關范圍內的每個整數是否出現在HashSet
並返回沒有出現的第一個(也是唯一一個)。
無論如何,您的兩個實現都不滿足O(n)
運行時間和O(1)
空間要求。
為了滿足所需的運行時間和空間,應該計算數組元素的總和,然后從(A.length+1)*A.length/2
減去該總和。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.