Что происходит, ребята? Если вы еще не сделали этого, обязательно загляните на мой сайт и ознакомьтесь с некоторыми проектами, которые я уже реализовал! Http://aaronmassey.pro/

Пятница должна была быть днем, когда я публикую учебник по алгоритму, но я совершенно забыл из-за праздника. Раз уж я забыл, то сделаю две, чтобы наверстать упущенное. Вот пара алгоритмов, которые я решил на CodeFights.

Подсказка №1 - После того, как они стали известными, все CodeBots решили переехать в новое здание и жить вместе. Здание представлено прямоугольным matrix комнатами. Каждая ячейка в matrix содержит целое число, которое представляет цену комнаты. Некоторые комнаты бесплатные (их стоимость 0), но это, вероятно, потому, что в них обитают привидения, поэтому все боты их боятся. Вот почему любая комната, которая свободна или расположена где-нибудь ниже свободной комнаты в том же столбце, не считается подходящей для проживания ботов. in. Помогите ботам рассчитать общую стоимость всех подходящих для них комнат.

ex. matrix = [[0, 1, 1, 2], 
              [0, 5, 0, 0], 
              [2, 0, 3, 3]]     ans. 1+1+2+5=9

Для начала нам нужно пройтись по матрице и найти, где были нули. Я сделал это с помощью вложенного цикла for и оператора if.

for (let i=0; i<matrix.length; i++){
  for (let j=0; j<matrix[i].length; j++){
    if (matrix[i][j] === 0) {
                
    }
  }
}

Первый цикл for (i) проходит через внешний массив. Второй цикл for (j) проходит через внутренние массивы.

Внутри оператора if мы хотим установить для каждого значения в том же столбце значение 0, если оно ниже текущего значения. Мы можем сделать это с помощью другого цикла.

if (matrix[i][j] === 0) {
  for (let k=i+1; k<matrix.length; k++){
    matrix[k][j] = 0;
  }
}

«K» изначально установлен на i + 1, чтобы сместить текущее значение и начать со следующей строки.

По сути, мы закончили! Все, что нам нужно сделать, это просуммировать все значения внутри массива. Я сделал это с помощью переменной total и вложенного цикла for.

let total = 0;
for (let x=0; x<matrix.length; x++){
  for (let y=0; y<matrix[x].length; y++){
    total += matrix[x][y]
  }
}
    
return total;

Вот и все, мы успешно нашли общую стоимость жилых домов! Полный код ниже.

function matrixElementsSum(matrix) {
   let total = 0;
    
   for (let i=0; i<matrix.length; i++){
     for (let j=0; j<matrix[i].length; j++){
       if (matrix[i][j] === 0) {
         for (let k=i+1; k<matrix.length; k++){
           matrix[k][j] = 0;
         }
       }
     }
   }
    
   for (let x=0; x<matrix.length; x++){
     for (let y=0; y<matrix[x].length; y++){
       total += matrix[x][y]
     }
   }
    
   return total;
}

Подсказка №2 - Область формы

Ниже мы определим n-интересный многоугольник. Ваша задача найти площадь многоугольника для заданного n.

1-Интересный многоугольник - это просто квадрат со стороной длиной 1. n интересный многоугольник получается, если взять n - 1 интересный многоугольник и добавить 1 интересных многоугольников к его краю, бок о бок.

  • Для n = 2 вывод должен быть
    shapeArea(n) = 5;
  • Для n = 3 вывод должен быть
    shapeArea(n) = 13

Вы можете увидеть 1-, 2-, 3- и 4 интересных многоугольников на картинке ниже.

Посмотрев на картинку, я сразу увидел закономерность. Форма представляет собой квадрат, но внутри квадрата имеется n-1 столбцов, а в каждом столбце n-1 единиц. Благодаря этому шаблону площадь можно легко найти, немного изменив формулу площади для квадрата.

area = side² - это исходная площадь по формуле квадрата. Мы также должны учитывать столбцы, которые также образуют квадрат, но с каждой стороной на 1 меньше, поэтому площадь = (сторона-1) ² * (сторона-1) ². Затем мы просто складываем их вместе, чтобы получить общую площадь.

function shapeArea(n) {
    return (n*n) + ((n-1)*(n-1));
}

Дайте мне знать, если вы знаете более простые решения для этих алгоритмов. Разместите их ниже, и я их проверю!