Привет, сегодня я хочу написать рецензию на одно из испытаний кодовых войн. Я не знаю, правильно это или неправильно. Но да, эта проблема, я не могу решить ее в одиночку. Я следую этому предоставленному коду.
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];
}
Так просто, да?
Спасибо