проблема с исходным кодом алгоритма edgecase

#javascript #arrays #algorithm

#javascript #массивы #алгоритм

Вопрос:

Я решаю следующую проблему:

Учитывая массив candies и целое число extraCandies, где candies[i] представляет количество конфет, которое есть у i-го ребенка.

Для каждого ребенка проверьте, есть ли способ распределить дополнительные конфеты среди детей таким образом, чтобы у него или нее было наибольшее количество конфет среди них. Обратите внимание, что у нескольких детей может быть наибольшее количество конфет.

Пример 1:

Ввод: конфеты = [2,3,5,1,3], дополнительные конфеты = 3 Вывод: [верно, true, true, false, true] Объяснение: у ребенка 1 есть 2 конфеты, и если он или она получит все дополнительные конфеты (3), у них будет 5 конфет — наибольшее количество конфет среди детей. У ребенка 2 есть 3 конфеты, и если он или она получит по крайней мере 2 дополнительные конфеты, у них будет наибольшее количество конфет среди детей. У ребенка 3 есть 5 конфет, и это уже наибольшее количество конфет среди детей. У ребенка 4 есть 1 конфета, и даже если он или она получит все дополнительные конфеты, у них будет только 4 конфеты. У ребенка 5 есть 3 конфеты, и если он или она получит по крайней мере 2 дополнительные конфеты, у них будет наибольшее количество конфет среди детей. Пример 2:

Входные данные: candies = [4,2,1,1,2], extraCandies = 1 Выходные данные: [true, false, false,false, false] Объяснение: Есть только 1 дополнительная конфета, поэтому только у ребенка 1 будет наибольшее количество конфет среди детей, независимо от того, кто возьмет дополнительную конфету. Пример 3:

Входные данные: candies = [12,1,12], extraCandies = 10 Выходные данные: [true, false, истина]

Ограничения:

2 <= конфеты.длина <= 100 1 <= candies [i] <= 100 1 <= extraCandies <= 50

вот мой код, а под моим кодом ошибка, которую я получаю, но она кажется правильной?

 const kidsWithCandies = (candies, extraCandies) => {
    let candiesTwo = [...candies]
    candiesTwo = candiesTwo.sort()
    
    let arr = []
    let highestNum = candiesTwo[candiesTwo.length -1]
    
    for(let i = 0; i < candies.length; i  ) { 
        if(candies[i]   extraCandies >= highestNum) { 
            arr.push(true)
        }  else { 
          arr.push(false)
        }
    }
    return arr
}
  

Я получаю

 71 / 103 test cases passed.
Status: Wrong Answer
Submitted: 3 minutes ago
Input:
[1,10,10,3]
1
Output:
[false,true,true,true]
Expected:
[false,true,true,false]
  

Ответ №1:

По умолчанию метод сортировки сортирует элементы в алфавитном порядке. Вы должны обновить с

 candiesTwo = candiesTwo.sort()
  

Для

 candiesTwo.sort((a, b) => a-b);
  

для числовой сортировки.

Комментарии:

1. Или найдите максимальное число, используя вместо этого Math.max (…candies), однако вы указали на фактическую проблему в решении выше.

2. Спасибо. Это определенно приятно знать на будущее. Я решил ее также с помощью Math.max (… candies)

3. Math.max (… candies) отлично работает в большинстве случаев. Но в крайнем случае, например, длина конфет очень велика, это не сработает. Конечно, для этой проблемы все в порядке (<100) @stephen1993

Ответ №2:

Если бы мы использовали sort , временная сложность была бы порядка N Log N . Вот O(N) решение:

 const kidsWithCandies = (candies, extraCandies) => {
    let maxCandies = 0;
    const greatest = [];

    for (const candy of candies) {
        (candy > maxCandies) amp;amp; (maxCandies = candy);
    }

    for (let index = 0; index < candies.length;   index) {
        greatest.push(candies[index]   extraCandies >= maxCandies);
    }
    return greatest;
};
  

Ответ №3:

Используйте функцию сравнения для сортировки чисел, иначе они будут в алфавитном порядке. По умолчанию метод sort() сортирует значения в виде строк в алфавитном и возрастающем порядке.

Простой пример

 const candies = [4, 11, 22, 2, 1];

console.log('No compare function:', JSON.stringify([...candies].sort()))

candies.sort((a, b) => a - b);
console.log('With compare function:', JSON.stringify(candies))