Это проблема, которую я решаю ( это пример задачи, а не реальная проблема):
Учитывая N чисел, [N <= 10 ^ 5] нам нужно подсчитать общее количество пар чисел, разность которых равна K. [K> 0 и K <1e9]
Формат ввода: 1-я строка содержит N и K (целые числа). 2-я строка содержит N номеров набора. Гарантируется, что все N чисел различны. Формат вывода: одно целое число, обозначающее "нет" пар чисел, имеющих различие K.
Sample Input #00:
5 2
1 5 3 4 2
Sample Output #00:
3
Sample Input #01:
10 1
363374326 364147530 61825163 1073065718 1281246024 1399469912 428047635 491595254 879792181 1069262793
Sample Output #01:
0
У меня уже есть решение (и я не знаю не смог оптимизировать его так, как я надеялся). В настоящее время мое решение получает оценку 12/15 при запуске, и мне интересно, почему я не могу получить 15/15 (мое решение другой проблемы было не таким эффективным, но получилось все по пунктам). Судя по всему, код запускается с использованием «Mono 2.10.1, C # 4».
Так может ли кто-нибудь придумать лучший способ дальнейшей оптимизации? Профилировщик VS советует избегать вызовов String.Split и Int32.Parse. Вызовов Int32.Parse нельзя избежать, хотя, думаю, я мог бы оптимизировать токенизацию массива.
Мое текущее решение:
using System;
using System.Collections.Generic;
using System.Text;
using System.Linq;
namespace KDifference
{
class Solution
{
static void Main(string[] args)
{
char[] space = { ' ' };
string[] NK = Console.ReadLine().Split(space);
int N = Int32.Parse(NK[0]), K = Int32.Parse(NK[1]);
int[] nums = Console.ReadLine().Split(space, N).Select(x => Int32.Parse(x)).OrderBy(x => x).ToArray();
int KHits = 0;
for (int i = nums.Length - 1, j, k; i >= 1; i--)
{
for (j = 0; j < i; j++)
{
k = nums[i] - nums[j];
if (k == K)
{
KHits++;
}
else if (k < K)
{
break;
}
}
}
Console.Write(KHits);
}
}
}