c # Array.IndexOf (Array, item) нужен ближайший элемент, если нет совпадения - PullRequest
0 голосов
/ 26 апреля 2018

Вот метод получения массивов буксировки в качестве параметров, массивы результатов (в порядке убывания), которые содержат дублированные значения, я удалил дубликат и сохранил его в новом массиве без дубликатов, второй массив содержит специальные очки игрока.

Мне нужно оценить ее ранг в массиве баллов за каждая оценка в ее массиве. Я мог бы сделать это для цикла for, но это требует длительного времени, я пытаюсь использовать метод Array .IndexOf, но я получил -1 для несуществующих значений.

Код:

static int[] climbingLeaderboard(int[] scores, int[] alice)
{
    var aliceRecord = new List<int>();
    int[] oneArray;
    oneArray = scores.Distinct().ToArray();
    foreach (var aliceScore in alice)
    {
        if (aliceScore < oneArray[oneArray.Length - 1])
        {
            aliceRecord.Add(oneArray.Length + 1);
        }
        else
        {
            var rank = Array.IndexOf(oneArray, aliceScore);
            if (rank < 0)
            {
              //Here I need the help
              //I comented the un efficient code
               //for (int i = 0; i < oneArray.Length; i++)
               //{
               //    if (aliceScore >= oneArray[i])
               //    {
               //        aliceRecord.Add(i + 1);
               //        break;
               //    }
               //
               //
               //}
            }
            else
            {
                aliceRecord.Add(rank + 1);
            }
        }
    }
    return aliceRecord.ToArray();

}

1 Ответ

0 голосов
/ 26 апреля 2018

Я мог бы сделать это для цикла, но это требует длительного времени

Array.IndexOf - это операция O (n), поэтому вы не получите большого улучшения по сравнению с запуском цикла.

Сортировка oneArray открыла бы более быстрый подход - использование бинарного поиска:

var oneArray = scores.Distinct().OrderBy(s=>s).ToArray();
foreach (var aliceScore in alice) {
    int pos = Array.BinarySearch(oneArray, aliceScore);
    if (pos < 0) {
        // When the index is negative, it represents the bitwise
        // complement of the next larger score:
        pos = ~pos - 1;
    }
    // Array is ordered in ascending order, so you want the index
    // counting from the back
    aliceRecord.Add(oneArray.Length - pos);
}
...