当前位置: 首页 > 知识库问答 >
问题:

如何基于当前值在C#哈希表中搜索一个值,并获取密钥,而不是TRUE或FALSE

锺离穆冉
2023-03-14

我试图解决一个问题,检查给定int[]的任意两个元素值之和是否等于给定的和值,返回true,检查所有元素后未找到任何内容,返回false。

我用nested for解决了这个问题。。如下所示轻松循环:

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。

共有1个答案

吴举
2023-03-14

我想这就是你想要的?假设给定的不能包含同一个数字两次。

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;
}

我们使用哈希集

您可以添加另一个优化,前提是给定的是排序的:

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;   
    }
}

然而,除非给定的非常大,否则这几乎肯定会比问题中的简单解决方案慢。直接比较int非常快速,HashSet

 类似资料:
  • 问题内容: 我有一个哈希表,其键的模式为USER_TEL,例如: 现在,我想获取密钥中具有相同TEL的所有用户的地址。 我想出的是: 我得到而不是价值观。 问题答案: 您应该使用HSCAN命令。 例如: 更新资料 Python实现:

  • 我刚刚开始学习哈希表,我知道如何插入,但不知道如何搜索。以下是我将基于这个问题的算法: 散列密钥 线性探测碰撞分辨率。 假设我用键1、11和21调用两次插入。这将返回所有3个键的槽1。冲突解决后,表在槽1、2和3处将有值1、11和21。这就是我对插入的理解。 完成此操作后,如果搜索键11和21,我将如何获得插槽2和3?从我所读到的内容来看,搜索哈希表应该做与插入完全相同的事情,除非当你到达所需的插

  • 问题内容: 我有 我想按 位置 获得 职位, 而不是关键 职位 。 我不想使用迭代。 还有其他方法可以基于索引获取Value吗? 问题答案: 您无法获得基于索引的值,只是那样行不通。一种解决方法是根据您的值创建一个新列表,然后根据索引获取值。

  • 我试图从ruby中的哈希表中获取第一个键和值键。我不知道散列的键值,因为它被传递给了方法。我在网上找不到如何将第一个键/值作为单独的哈希表查找。我认为只会试图找到一个名为0的元素,当我运行代码时,它只会返回。 我知道我可以找到密钥名和值,然后根据它们创建一个新的哈希,但我想知道是否有更简单的方法来做到这一点,这样我就可以立即得到一个哈希。 下面是我的代码: 这让我得到了正确的结果问题是我不明白为什

  • 问题内容: 我需要找到具有true的行或值大于15的行。我可以使用for循环进行迭代,但是,我想知道numpy是否可以更有效地做到这一点? 问题答案: 要获取至少一项大于15的行号:

  • 问题内容: 对于给定的URL,我想从数据库中获取哈希后名称的年龄。因此,对于url这样,您会看到“ ”。 如何在网址中的哈希值之后提取值?(我需要一种安全的,与所有浏览器兼容的NON-JAVASCRIPT方式)。我想要像$ _GET [‘after hash’]这样。 我不使用GET的原因是因为我想使用AJAX和jquery的历史记录插件。 基本上我想要的是使用ajax根据哈希后分配的值从服务器检