簡體   English   中英

如何根據當前值在 C# Hashtable 中搜索值並獲取鍵而不是 TRUE 或 FALSE

[英]How to search a value in C# Hashtable based on current value and get the key rather than TRUE or FALSE

我試圖解決一個問題,即檢查給定 int[] 中的任何兩個元素值的 SUM 是否等於給定的總和值,返回 true 並且在檢查所有元素后未找到任何內容,返回 false。

我使用嵌套的 for..loop 輕松解決了這個問題,如下所示:

public bool CheckValue (int[] given, int sum) {
    if (given == null) {
        return false;
    } else if (given.Length == 0 || given.Length == 1) {
        return false;
    } else {
        for (int i = 0; i < given.Length - 1; i++) {
            for (int j = i + 1; j < given.Length; j++) {
                if ((given[i] + given[j]) == sum) {
                    return true;
                }
            }
        }

        return false;
    }
}

但我想在第二個循環中使用 Hashtable 來解決它,因為它會簡化搜索過程並嘗試以下代碼:

private static bool CheckValueUsingHashTable (int[] given, int sum) {
    if (given == null) {
        return false;
    } else if (given.Length == 0 || given.Length == 1) {
        return false;
    } else {
        Hashtable hashs = new Hashtable ();

        for (int i = 0; i < given.Length; i++) {
            hashs.Add (i, given[i]);
        }

        for (int j = 0; j < given.Length; j++) {
            int valueToAdd = sum - given[j];
            if (hashs.ContainsValue (valueToAdd)) {
                return true;
            }
        }

        return false;
    }
}

我現在面臨的問題是,如果給定的數組是 {1,2,3,4} 並且給定的總和是 2,它可以將第一個元素與自身相加並返回 TRUE,但顯然,我不希望這種情況發生。

那么,請問如何從哈希表中搜索值並獲取密鑰。 目前 function 根據值的存在返回 TRUE 或 FALSE。

我想這就是你所追求的? 假設given不能包含兩次相同的數字。

public static bool CheckValue(int[] given, int sum)
{
    if (given == null)
    {
        return false;
    }
    if (given.Length == 0 || given.Length == 1)
    {
        return false;
    }

    var hashSet = new HashSet<int>(given);

    foreach (int num in given)
    {
        int remainder = sum - num;
        if (remainder != num && hashSet.Contains(remainder))
        {
            return true;
        }
    }

    return false;
}

我們使用HashSet<int> ,它實際上是一個僅包含鍵的 HashSet/Dictionary。 對於每個可能的數字,我們找到余數。 我們檢查remainder != num (它解決了sum4num為 2、我們發現2存在於hashSet中的問題),然后查看余數是否在我們的 HashSet 中。

您可以添加另一個優化,前提是given已排序:

foreach (int num in given)
{
    int remainder = sum - num;
    if (remainder != num && hashSet.Contains(remainder))
    {
        return true;
    }

    // Addition is commutative (1 + 2 == 2 + 1), so if we're past the half-way point,
    // we're not going to find anything
    if (num > sum/2)
    {
        return false;   
    }
}

但是,除非given非常大,否則這幾乎肯定會比您問題中的幼稚解決方案 直接比較整數非常快,而HashSet<T>盡管 O(n) 會增加開銷。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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