簡體   English   中英

Java哈希集與Arrays.sort

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM