#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))