Привет, сегодня я хочу написать рецензию на одно из испытаний кодовых войн. Я не знаю, правильно это или неправильно. Но да, эта проблема, я не могу решить ее в одиночку. Я следую этому предоставленному коду.

https://gist.github.com/railsstudent/d40bd874d773794ff358c3465a6d2f5d

Мне действительно стыдно за другое решение. Но да, из-за этого я пишу эту статью. Я надеюсь, что смогу немного понять. Кстати, я тоже все еще учусь… Итак… los gehts!!!.

Вопрос

console.log(
  longestSlideDown([
    [75],
    [95, 64],
    [17, 47, 82],
    [18, 35, 87, 10],
    [20, 4, 82, 47, 65],
    [19, 1, 23, 75, 3, 34],
    [88, 2, 77, 73, 7, 63, 67],
    [99, 65, 4, 28, 6, 16, 70, 92],
    [41, 41, 26, 56, 83, 40, 80, 70, 33],
    [41, 48, 72, 33, 47, 32, 37, 16, 94, 29],
    [53, 71, 44, 65, 25, 43, 91, 52, 97, 51, 14],
    [70, 11, 33, 28, 77, 73, 17, 78, 39, 68, 17, 57],
    [91, 71, 52, 38, 17, 14, 91, 43, 58, 50, 27, 29, 48],
    [63, 66, 4, 68, 89, 53, 67, 30, 73, 16, 69, 87, 40, 31],
    [4, 62, 98, 27, 23, 9, 70, 98, 73, 93, 38, 53, 60, 4, 23],
  ])
);

Ответ

function longestSlideDown(pyramid) {
  let pyramidSum = [];
  pyramid.forEach((elem, index) => {
   pyramidSum.push(
      elem.map((e) => {
        return index === pyramid.length - 1 ? e : 0;
      })
    );
  });
  for (let i = pyramidSum.length - 2; i >= 0; i--) {
    for (let j = 0; j < pyramidSum[i].length; j++) {
      pyramidSum[i][j] =
        pyramid[i][j] +
        Math.max(pyramidSum[i + 1][j], pyramidSum[i + 1][j + 1]);
    }
  }
  return pyramidSum[0][0];
}

Первая строка сообщает нам, что мы строим переменную с именем пирамидаСумма, которая имеет пустой массив. После этого, используя функцию forEach, она принимает два параметра elem и index. Хорошо, давайте посмотрим, что такое elem и index. Итак, вот они

Войдя в консоль, мы получаем, что elem — это элемент индекса, а индекс — это номер индекса.

Пустой массив, который был объявлен ранее (pyramidSum), теперь проталкивается с картой elem с принимает параметр e. Эта функция вернет только последний индекс (pyramid.length - 1). Другой индекс, который не является последним индексом, будет равен 0. Вот так.

Чтобы было понятнее, давайте превратим все числа в строку, подобную этой

Поняв это, давайте начнем следующую часть этой функции, есть

Это цикл for, который перебирает длину пирамиды — 2. Общая длина этого массива равна 15. Таким образом, он будет перебирать 13 массивов.

Внутри первой петли устанавливается вторая петля. Он снова принимает длину пирамидыSum[i]. Это значит, вот так. Если у нас есть массив [[1,2],[2,3,4],[4,5,6]]. Таким образом, вывод [i==1] будет [1,2]. «j» будет снова повторять массив [i]. Итак, если мы перебираем массив [2][1]. Будет напечатано 5. Потому что [2] означает [4,5,6], а первый индекс [4,5,6] равен 5. Надеюсь, это легче понять.

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

Я не совсем понимаю об этом. Но, по крайней мере, я знаю, что пирамида будет перебираться по пирамиде в индексе [i][j], и к ней будет добавляться Math.max (наибольшее количество двух массивов) с использованием одновременного сложения.

Журнал пирамидыСумма это

Я имею в виду одновременно это

Массив решит, будет ли использовать наибольший индекс между двумя значениями и будет добавлен в up. Пока не нашел общую сумму. То есть ответ будет в индексе [0][0]. Таким образом, для закрытия эта функция возвращает пирамидную сумму [0] [0]. И да, он распечатает целевое значение

И это сделано.

К вашему сведению, это было решение от railsstudent. Я думаю, это было действительно здорово. Но есть более продвинутое решение. Мы сможем увидеть это, если закончим этот вызов. Но я дам вам прямо сейчас, вот самое эффективное решение

function longestSlideDown (pyramid) {
  return pyramid.reduceRight((last,current)=>current.map(
    (v,i)=>v+Math.max(last[i],last[i+1])
  ))[0];
}

Так просто, да?

Спасибо