Как бы я исправил свой подход к этой Манхэттенской Горизонте / Каменной Стене и где я ошибся?Javascript - PullRequest
0 голосов
/ 26 декабря 2018

Я только что столкнулся с этой проблемой и подумал, что попробую, но теперь я застрял и, если возможно, нуждаюсь в помощи.

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

Проблема:

Вы должны написать программу, чтобы помочь архитектору нарисовать горизонт города.Здания имеют прямоугольную форму, высота каждого здания представлена ​​элементом в данном массиве.

sample image

Вышеупомянутый горизонт выше представлен как [1,3,2,1,2,1,5,3,3,4,2] sample image

ТАК ЧТО ЗДЕСЬ, ЧТО Я РАБОТАЮ С:

const skyline =(H)=> {
let stack = [];
let count = 0;
let height = 0;

 const addBlock = (value) => {
    if (value > height) {
        stack.push(value - height);
        height = value;
        count += 1;
    }
 }

 const pop = (value) => {
    while (value < height) {
        height -= stack.pop();
    }  
    if (value > height) {
        addBlock(value)
    }
 }

  for (let i = 0; i < H.length; i += 1) {
    let value = H[i];
    if (value < height) {
        pop(value)
    } else if (value > height) { 
        addBlock(value)
     }
 }

    return count
 }

 skyline([1,3,2,1,2,1,5,3,3,4,2]) //Expect 9

// Тест СЛУЧАИ:

let strokes = [1,3,2,1,2,1,5,3,3,4,2] // Expect 9
// let strokes = [5,8] // Expect 8
// let strokes = [1,1,1,1] //  Expect 1

skyline(strokes)

Ответы [ 3 ]

0 голосов
/ 26 декабря 2018

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

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

В каждой строке вы обязательно убедитесь, что текущая точка (элемент массива) больше 0, что означает, что она является частью штриха.

Теперь в более сжатых словах:

  1. Пока есть rowLeft Я перейду массив.при каждом прохождении я буду:
  2. проверять, больше ли текущая позиция больше 0, что означает newStroke , это также означает, что есть rowLeft , и так как вы хотитечтобы продолжать движение вперед, вы хотели бы уменьшить текущий элемент на единицу.
  3. тогда, если есть newStroke и текущий элемент равен 0 (конец штриха) или если этоконец массива, я бы добавил 1 к моему счету numOfStrokes , а также указал бы, что, поскольку я только что закончил обводку, в настоящий момент нет newStroke .

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

0 голосов
/ 24 апреля 2019
function minimalNumberOfSkylinesIn(array) {

    if(array.length == 0) 
        return 0;

    let result = array[0];

    for(let i=1; i<array.length; ++i) {
        let differnce = array[i] - array[i-1];
        result += difference > 0 ? difference : 0;
    }

    return result;
}
0 голосов
/ 26 декабря 2018

Это основной алгоритм?

* Big eats small (and equal-sized)

* Small reduces big to small
  adding the difference

* Count last one standing

Примеры:

[5,8]
-> 8 eats 5, count 8

[1,1,1,1]
-> 1 eats 1 eats 1 eats 1
-> count 1

[1,3,2,1,2,1,5,3,3,4,2]
-> 3 eats 1
-> 2 reduces 3 to 2 and adds 3-2
-> 1 reduces 2 to 1 and adds 2-1
-> 2 eats 1
-> 1 reduces 2 to 1 and adds 2-1
-> 5 eats 1
-> 3 reduces 5 to 3 and adds 5-3
-> 3 eats 3
-> 4 eats 3
-> 2 reduces 4 to 2 and adds 4-2
-> count 2
Total: 1 + 1 + 1 + 2 + 2 + 2 = 9

Код JavaScript:

function f(A){
  let result = 0;
  for (let i=1; i<A.length; i++)
    result += Math.max(0, A[i-1] - A[i]);
  return result + A[A.length-1];
}

console.log(f([1,3,2,1,2,1,5,3,3,4,2]));
console.log(f([5,8]));
console.log(f([1,1,1,1]));

Один вкладыш:)

function f(A){
  return [0].concat(A).reduce((a,b,i,A) => a + Math.max(0, A[i-1] - b)) + A[A.length-1];
}
...