Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 25.05.2021, 13:15
Интересующийся
Отправить личное сообщение для vurdalak21 Посмотреть профиль Найти все сообщения от vurdalak21
 
Регистрация: 22.05.2021
Сообщений: 10

Помогите с задачей
You are given an integer array nums. You can choose exactly one index (0-indexed) and remove the element. Notice that the index of the elements may change after the removal.

For example, if nums = [6,1,7,4,1]:

Choosing to remove index 1 results in nums = [6,7,4,1].
Choosing to remove index 2 results in nums = [6,1,4,1].
Choosing to remove index 4 results in nums = [6,1,7,4].
An array is fair if the sum of the odd-indexed values equals the sum of the even-indexed values.

Return the number of indices that you could choose such that after the removal, nums is fair.
Пример:
Ввод: nums = [2,1,6,4]
Выход: 1
Пояснение:
Убрать индекс 0: [1,6,4] -> Четная сумма: 1 + 4 = 5. Нечетная сумма: 6. Нечестно.
Убрать индекс 1: [2,6,4] -> Четная сумма: 2 + 4 = 6. Нечетная сумма: 6. Справедливая.
Убрать индекс 2: [2,1,4] -> Четная сумма: 2 + 4 = 6. Нечетная сумма: 1. Нечестно.
Убрать индекс 3: [2,1,6] -> Четная сумма: 2 + 6 = 8. Нечетная сумма: 1. Нечестно.
Есть 1 указатель, который можно удалить, чтобы количество было справедливым.

Решил сделать в функциональном стиле, вот что у меня получилось, но ответ не верный, помогите найти, что я сделал не правильно

const sumOdd = function(nums) {
    return nums.map((num, i) => i % 2 ? 0 : num).reduce((num1, num2) => num1 + num2, 0)
}

const removeIndex = function(nums, ind) {
    return nums.slice(0, ind).concat(nums.slice(ind + 1))
}

const waysToMakeFair = function(nums) {
    const indexes = [...Array(nums.length).keys()]
    return indexes.filter(ind => sumOdd(removeIndex(nums, ind)) % 2 == 0).length
};
Ответить с цитированием
  #2 (permalink)  
Старый 25.05.2021, 13:59
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,012

Вариант, работающий за линейное время

function waysToMakeFair(arr) {
  if (!arr || !arr.length) {
    return 0;
  }
  let fullDelta = 0;
  const deltas = new Array(arr.length);
  for (let i = 0; i < arr.length; ++i) {
    fullDelta += i % 2 ? -arr[i] : arr[i];
    deltas[i] = fullDelta;
  }
  let count = 0;
  for (let i = 0; i < arr.length; ++i) {
    const prevDelta = i > 0 ? deltas[i - 1] : 0
    const nextDelta = fullDelta - deltas[i]
    if (prevDelta - nextDelta === 0) {
      count++
    }
  }
  return count
}

alert(waysToMakeFair([2,1,6,4]));
Ответить с цитированием
  #3 (permalink)  
Старый 25.05.2021, 14:31
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,012

кстати, можно переиспользовать переданный массив, чтобы не понадобился вспомогательный

function waysToMakeFair(arr) {
  if (!arr || !arr.length) {
    return 0;
  }
  let fullDelta = 0;
  for (let i = 0; i < arr.length; ++i) {
    fullDelta += i % 2 ? -arr[i] : arr[i];
    arr[i] = fullDelta;
  }
  let count = 0;
  for (let i = 0; i < arr.length; ++i) {
    const prevDelta = i > 0 ? arr[i - 1] : 0
    const nextDelta = fullDelta - arr[i]
    if (prevDelta - nextDelta === 0) {
      count++
    }
  }
  // восстанавливаем стартовые значения
  for (let i = arr.length - 1; i > 0; --i) {
    arr[i] = i % 2 ? -arr[i] + arr[i-1] : arr[i] - arr[i-1];
  }
  return count
}
Ответить с цитированием
  #4 (permalink)  
Старый 25.05.2021, 14:37
Интересующийся
Отправить личное сообщение для vurdalak21 Посмотреть профиль Найти все сообщения от vurdalak21
 
Регистрация: 22.05.2021
Сообщений: 10

Alexandroppolus,
спасибо за решение, но это не то что я хотел. мне нужно решить, чтобы было как в моем коде, несколько функций которые отвечают за своё и без циклов
Ответить с цитированием
  #5 (permalink)  
Старый 25.05.2021, 15:08
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,012

ох уж эти ФП-шники ))

function makeDeltas(arr) {
  let fullDelta = 0;
  return arr.map((num, i) => fullDelta += i % 2 ? -num : num);
}

const calc = (deltas) => deltas.reduce((count, d, i, arr) => 
    (i > 0 ? arr[i - 1] : 0) + d - arr[arr.length - 1] ? count : count + 1, 0)

const waysToMakeFair = (arr) => !arr || !arr.length ? 0 : calc(makeDeltas(arr))

alert(waysToMakeFair([2,1,6,4]));
Ответить с цитированием
  #6 (permalink)  
Старый 25.05.2021, 15:14
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,105

vurdalak21,
const sumOdd = function(nums) {
    return !nums.reduce((balance, num, i) => balance +=  i % 2 ? num : -num, 0)
}

const removeIndex = function(nums, ind) {
    nums = nums.slice(0);
    nums.splice(ind, 1);
    return nums
}

const waysToMakeFair = function(nums) {
    return Object.keys(nums).filter(ind => sumOdd(removeIndex(nums, ind)))
};
alert(waysToMakeFair( [2,1,6,4]));

Последний раз редактировалось рони, 25.05.2021 в 15:29.
Ответить с цитированием
  #7 (permalink)  
Старый 25.05.2021, 15:20
Интересующийся
Отправить личное сообщение для vurdalak21 Посмотреть профиль Найти все сообщения от vurdalak21
 
Регистрация: 22.05.2021
Сообщений: 10

рони,
то что нужно, спасибо
Ответить с цитированием
  #8 (permalink)  
Старый 25.05.2021, 15:29
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,105

vurdalak21,
убрал умножение
balance +=  i % 2 ? num : -num
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
помогите с задачей Vovan1998 Общие вопросы Javascript 3 20.09.2016 12:05
Помогите с задачей JS_Den Общие вопросы Javascript 2 14.02.2012 00:24
Помогите с задачей Mauzil Общие вопросы Javascript 1 31.12.2011 06:52
Помогите, пожалуйста, с простой задачей Devi Ваши сайты и скрипты 1 13.07.2010 04:48
Помогите разобраться с задачей (поиск строки) Absinthe Ваши сайты и скрипты 6 07.12.2009 09:17