у какого ребенка больше всего проблем с алгоритмом candies

#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. Спасибо за ответ, Эмма, я отредактировал сообщение и удалил функцию minMax из функции main. Я случайно оставил это в коде. Я думал, что удалил его. Я не совсем понимаю оператор spread. Не могли бы вы мне это объяснить? И как вы избавились от необходимости иметь оператор if / else?