[英]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
(它解決了sum
為4
、 num
為 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.