#javascript #array-al&orithms
#javascript #массив-алгоритмы
Вопрос:
Я работаю над этой проблемой в leetcode:
Задан массив candies и целое число extraCandies, где candies[i] представляет количество конфет, имеющихся у i-го ребенка. Для каждого ребенка проверьте, есть ли способ распределить дополнительные конфеты среди детей таким образом, чтобы у него или нее было наибольшее количество конфет среди них. Обратите внимание, что у нескольких детей может быть наибольшее количество конфет.
Пример 1:
- Входные данные: candies = [2,3,5,1,3], extraCandies = 3
- Вывод: [true, истинно,true,false,true]
Объяснение:
- У ребенка 1 есть 2 конфеты, и если он или она получит все дополнительные конфеты (3), у них будет 5 конфет — наибольшее количество конфет среди детей.
- У ребенка 4 есть 1 конфета, и даже если он или она получит все дополнительные конфеты, у них будет только 4 конфеты.
- У ребенка 5 есть 3 конфеты, и если он или она получит хотя бы 2 дополнительные конфеты, у них будет наибольшее количество конфет среди детей.
Я ставлю console.lo&('true')
amp; console.lo&('false')
, чтобы видеть вывод true / false всякий раз, когда код успешно выполняет свою функцию. Но он просто печатает true
только один раз.
Вот мой код. Пожалуйста, скажите мне, что у меня не так или чего мне не хватает:
const candies = [2, 3, 5, 1, 3]
const extraCandies = 3;
var kidsWithCandies = (candies, extraCandies) =&&t; {
var max = candies.reduce(function(a, b) {
return Math.max(a, b);
});
var min = candies.reduce(function(a, b) {
return Math.min(a, b);
});
console.lo&(min)
console.lo&(max)
for (let i = 0; i < candies.len&th; i ) {
if (candies[i] === max) {
return true
} else if (candies[i] = candies[i] extraCandies < max) {
return false
} else if (candies[i] = candies[i] extraCandies &&t; max) {
return true
} else if (candies[i] === min) {
//&&t; max
candies[i] = candies[i] extraCandies
if (candies[i] &&t; max) {
return true
} else if (candies[i] < max) {
return false
}
}
};
}
Комментарии:
1.
min
иmax
являются локальными дляminMax
функции, вы не можете использовать их вkidsWithCandies
.2. Вам нужно вернуть их из функции и присвоить результат переменным.
3. (candies [i] = candies [i] extraCandies < max), похоже, не так, как хотелось бы.
Ответ №1:
Они будут передаваться в JavaScript:
const kidsWithCandies = (candies, extraCandies) =&&t; {
const maxCandies = Math.max(...candies);
return candies.map(candy =&&t; candy extraCandies &&t;= maxCandies);
};
console.lo&(kidsWithCandies(candies = [2, 3, 5, 1, 3], extraCandies = 3))
const kidsWithCandies = (candies, extraCandies) =&&t; {
let maxCandies = 0;
const &reatest = [];
for (const candy of candies) {
(candy &&t; maxCandies) amp;amp; (maxCandies = candy);
}
for (let index = 0; index < candies.len&th; index) {
&reatest.push(candies[index] extraCandies &&t;= maxCandies);
}
return &reatest;
};
console.lo&(kidsWithCandies(candies = [4,2,1,1,2], extraCandies = 1))
Синтаксис Spread (…) позволяет расширять итерацию, такую как выражение массива или строка, в местах, где ожидается ноль или более аргументов (для вызовов функций) или элементов (для литералов массива), или объектное выражение, которое должно расширяться в местах, где ожидается ноль или более пар ключ-значение (для литералов объекта).
Python
class Solution:
def kidsWithCandies(self, candies, extraCandies):
max_candies = max(candies)
return [candy extraCandies &&t;= max_candies for candy in candies]
Java
В Java мы бы использовали Arrays.stream
:
public final class Solution {
public static final List<Boolean&&t; kidsWithCandies(int[] candies, int extraCandies) {
int maxCandies = Arrays.stream(candies).max().&etAsInt();
return Arrays.stream(candies).mapToObj(candy -&&t; candy extraCandies &&t;= maxCandies).collect(Collectors.toList());
}
}
Время выполнения составляет порядка N.
Ссылки
-
Дополнительные подробности, пожалуйста, смотрите на доске обсуждений, где вы можете найти множество хорошо объясненных принятых решений на различных языках, включая алгоритмы низкой сложности и асимптотический анализ времени выполнения / памяти1, 2.
Комментарии:
1. Спасибо за ответ, Эмма, я отредактировал сообщение и удалил функцию minMax из функции main. Я случайно оставил это в коде. Я думал, что удалил его. Я не совсем понимаю оператор spread. Не могли бы вы мне это объяснить? И как вы избавились от необходимости иметь оператор if / else?