【问题标题】:Where is my mistake in solution of HackerRank - "Pairs" problem (rated medium)?我在解决 HackerRank - “Pairs” 问题(评级为中等)方面的错误在哪里?
【发布时间】:2021-10-28 04:51:50
【问题描述】:

给定一个整数数组和一个目标值,确定差值等于目标值的数组元素对的数量。

这里是问题的链接: https://www.hackerrank.com/challenges/pairs/problem

我的算法应该做到以下几点:

  • 对数组进行排序
  • 比较 2 个邻居编号 (i, i+1): 如果它们之间的差异等于给定的数字 k,则递增 结果 如果差值小于给定数字,则比较 i+1 用 0,...,i-1 个元素尝试在其中找到可能的对。 如果差值大于给定数字 k,则增加 i 并对下一对执行相同操作。

我认为算法是正确的,我在实现中找不到错误。我的代码通过了主要测试用例并通过了 5/18 个额外的测试用例。请帮我找出我的错误。

这是我的代码:

public static int pairs(int k, List<int> arr)
{
    arr.Sort();
    var result = 0;
    
    for (var i = 0; i < arr.Count - 1; ++i){
        var diff = arr[i + 1] - arr[i];
        if (diff > k) continue;
        else if (diff == k) ++result;
        else {
            result = CompareWithPreviousValues(arr, k, i + 1, result);
        }
    }
    
    return result;
}

private static int CompareWithPreviousValues(List<int> arr, int k, int indexOfElementToCompare, int result)    {
    var j = 2;
    for (var i = indexOfElementToCompare; i - j >= 0; --i){
        var diff = arr[i] - arr[i - j];
        if (diff < k) ++j;
        else if (diff == k){
            ++result;
            return result;
        }
        else return result;
    }
    
    return result;
}

【问题讨论】:

  • 听起来你解决了这个问题,但在未来包含 13/18 测试用例中的哪一个失败会很有用。
  • @JeremyCaney 感谢您的建议,但问题是它们已被锁定且不可见。

标签: c# .net algorithm search array-algorithms


【解决方案1】:

在发布问题之前,我再次检查了代码并发现了我犯的错误。但是由于在 stackoverflow 中没有讨论这个问题,而且有些人发现代码中的错误可能很有趣,所以我决定发布无论如何。我已经花时间填写问题了:D

所以错误.. 当然这是一个小错误,但令人不快。 DISCLAMER 对于那些想找出错误的人,我建议不要继续阅读下面的内容,因为这里有固定的代码:D

错误出现在“CompareWithPreviousValues”方法的for循环中。 每次迭代后,由于某种原因,我减少了。我可能会机械地写我,因为大多数循环都使用“i”。 所以这里是该方法的正确版本:

private static int CompareWithPreviousValues(List<int> arr, int k, int n, int result)    {
    var j = 2;
    for (var i = n; i - j >= 0; ++j){
        var diff = arr[i] - arr[i - j];
        if (diff < k) continue;
        else if (diff == k){
            ++result;
            return result;
        }
        else return result;
    }
    
    return result;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-03
    • 1970-01-01
    相关资源
    最近更新 更多