对于给定的以空格分隔的数字列表,计算相差 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/