如何基于当前值在C#哈希表中搜索值并获取键,而不是TRUE或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,但是显然,我不希望那样发生。

所以,请问如何从哈希表中搜索值并获取密钥。当前,该函数根据存在的值返回TRUE或FALSE。

leekikong1986 回答:如何基于当前值在C#哈希表中搜索值并获取键,而不是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的问题,我们发现{{1 }}),然后查看其余部分是否在我们的HashSet中。

如果已对2进行了排序,则可以添加另一个优化:

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; } } 尽管O(n)会增加开销。

本文链接:https://www.f2er.com/3150186.html

大家都在问