c# - 在 List<int> 中查找具有指定差异的数字

标签 c# generic-collections

对于给定的以空格分隔的数字列表,计算相差 N 的数字对总数的最有效方法是什么。

例如输入的命令行将是:

5 2

其中 5 是跟在后面的数字的个数,2 是所需的差值

1 5 3 4 2

要考虑的 5 个数字

输出应该是 3个 因为 (5,3)、(4,2) 和 (3,1) 的差都是 2

我可以让这个算法工作,但是如果你有大量的数字要处理,有没有更有效的方法呢?我已经包含了三个比较选项,第二个应该比第三个好,但是我忘记了什么可以让它更快吗?

private static void Difference()
{
    string[] firstInput = SplitInput(Console.ReadLine());

    int numberOfNumbers = int.Parse(firstInput[0]);
    int diffOfNumbers = int.Parse(firstInput[1]);

    string[] secondInput = SplitInput(Console.ReadLine());

    List<int> numbers = secondInput.Select(x => Int32.Parse(x)).ToList();

    int possibleCombinations = 0;

    // Option 1
    foreach (int firstNumber in numbers)
    {
        List<int> compareTo = numbers.GetRange(numbers.IndexOf(firstNumber) + 1, numbers.Count - numbers.IndexOf(firstNumber) - 1);

        foreach (int secondNumber in compareTo)
        {
            int diff = firstNumber - secondNumber;

            if (Math.Abs(diff) == diffOfNumbers)
            {
                possibleCombinations++;
            }
        }
    }

    // Option 2
    foreach (int firstNumber in numbers)
    {
        if (numbers.Contains(firstNumber + diffOfNumbers))
        {
                possibleCombinations++;
        }
    }

    // Option 3
    foreach (int firstNumber in numbers)
    {
        foreach (int secondNumber in numbers)
        {
            int diff = firstNumber - secondNumber;

            if(Math.Abs(diff) == diffOfNumbers)
            {
                possibleOptions++;
            }
        }
    }

    Console.WriteLine(string.Format("Possible number of options are: {0}", possibleCombinations));
    Console.ReadLine();
}

private static string[] SplitInput(string input)
{
    return input.Split(new char[1] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
}

最佳答案

如果不允许或忽略重复数字(只计算唯一对),您可以使用 HashSet<int> :

HashSet<int> myHashSet = ...
int difference = ...
int count;
foreach (int number in myHashSet)
{
    int counterpart = number - difference;
    if (myHashSet.Contains(counterpart))
    {
        count++;
    }
}

关于c# - 在 List<int> 中查找具有指定差异的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26181030/

相关文章:

C++ 保留指向模板对象的指针集合,所有指针都派生自非模板类

C# - 从 "cast"List<BaseClass> 到 List<DerivedClass> 的简单方法?

c# - 目录安全

c# - 从 Silverlight 覆盖 (IE7) 浏览器键盘处理

c# - 如何为 C# 和 Java 设置符号服务器

c# - 我应该在 C# 中选择哪个通用集合来维护排序的 "list"

c# - 为什么委托(delegate)在用作属性(property)时必须公开?

Java 通用问题 : cannot cast Map<K, V> 到 M extends Map<K, V>

android - PagedListAdapter 中的通用列表

java - 使用泛型创建类时出现 "> expected"错误