Лучший способ искать степень насыщения в отсортированном списке

Gulp сам по себе не переупорядочивает то, что происходит при последующих вызовах .pipe. Я не уверен, что именно происходит в вашем случае, но ваш код излишне хрупок .

Рассмотрим этот шаблон:

gulp.src("...")
  .pipe(pluginA)
  .pipe(pluginB)

И предположим, что pluginA просто печатает на консоль pluginA, а pluginB просто печатает на консоль pluginB. Вы можете подумать, что результат будет:

pluginA
pluginB
pluginA
pluginB
pluginA
...

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

pluginA 
pluginA 
pluginA 
pluginB 
pluginA 
pluginB 
pluginB 
pluginB
pluginA 
...

Файлы должны быть просмотрены сначала pluginA, но нет гарантии, что pluginB обработает файл до того, как pluginA перейдет к следующему файлу. [ 1129]

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

Так получилось, что хрупкая часть вашего кода не нужна . Нет необходимости записывать путь к файлу в переменной вне потока файлов, а затем читать его в более поздней части потока. gulp-if передаст проверяемый файл в состояние, которое вы ему передаете. Вот пример:

const gulp = require("gulp");
const gulpIf = require("gulp-if");
gulp.task("default", () =>
          gulp.src("src/**")
          .pipe(gulpIf((file) => {
            console.log(file.path);
            return file.basename === "a";
          }, gulp.dest("out"))));

Эта задача поместит в подкаталог out все файлы с базовым именем "a". Вы также увидите на консоли абсолютный путь к каждому файлу, который проходит через условие, заданное в gulpIf.

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

7
задан abhilash 26 September 2017 в 10:54
поделиться

4 ответа

Двоичный поиск не является ответом, потому что Вы только получаете один шанс переоценить. Двоичный поиск требует log m максимальные переоценки.

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

Большие шаги примерно sqrt(m), но они больше ранний, и меньший позже, потому что, если первый кокос повреждается рано, можно предоставить больше повторений во второй фазе.

StepSize = (minimum s such that s * (s + 1) / 2 >= m)
CurrentFloor = 0

While no coconuts broken {
    CurrentFloor += StepSize
    StepSize -= 1

    Drop coconut from CurrentFloor
}

CurrentFloor -= StepSize + 1

While one remains coconut unbroken {
    CurrentFloor += 1
    Drop remaining coconut from CurrentFloor
}

// CurrentFloor is now set to the lowest floor that will break the coconut, 
// using no more total drops than the original value of StepSize
8
ответ дан 6 December 2019 в 06:25
поделиться

Вопросы об интервью как это разработаны, чтобы видеть, как Вы думаете. Таким образом, я, вероятно, упомянул бы O (N^0.5) решение как выше, но также и я дам следующее обсуждение...

Так как кокосы могут иметь внутреннее взламывание со временем, результаты не могут быть настолько последовательными к O (N^0.5) решение. Хотя O (N^0.5) решение эффективен, это не совсем надежно.

Я рекомендовал бы линейный O (N) решение с первым кокосом и затем проверил бы результат со вторым кокосом. Где N является количеством этажей в здании. Таким образом для первого кокоса Вы пробуете 1-й этаж, затем 2-е, затем 3-е...

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

Для кокосового № 2 Вы не должны тестировать на 1.. B-1, потому что Вы уже знаете, что первый кокос не повреждался на полу B-1, B-2... 1. Таким образом, только необходимо попробовать его на B.

Если 2-й кокос повреждается на B, то Вы знаете, что B является рассматриваемым полом. Если это не повреждается, можно вывести, что было внутреннее взламывание и неисправность кокоса со временем и что тест испорчен для начала. Вам нужно больше кокосов.

Учитывая, что создающие размеры довольно ограничены, дополнительная уверенность в Вашем решении стоит O (N) решение.

Как @Rafał Dowgird упомянул, решение также зависит от того, является ли рассматриваемая обезьяна африканской обезьяной или европейской обезьяной. Это общеизвестно, что африканские обезьяны бросают с намного большей силой. Следовательно делая повреждающийся пол B только точным с различием +/-2 этажа.

Чтобы гарантировать, что обезьяна не устает от всей той лестницы, также было бы желательно присоединить строку к первому кокосу. Тем путем Вы не должны делать 1+2 +.. +B = B* (B+1)/2 лестничные пролеты для первого кокоса. Необходимо было бы только сделать точно B лестничные пролеты.

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

Мы также делаем предположение, что здание находится на земле, и сила тяжести установлена в 9.8m/s^2. Мы также предположим, что никакие волны гравитации не существуют.

15
ответ дан 6 December 2019 в 06:25
поделиться

Лучшее решение, которое я знаю, 2*sqrt (n). Отбросьте первый кокос от sqrt (n), 2*sqrt (n)... до n (или пока он не повредится). Затем отбросьте второй от последней известной "безопасной" точки в инкрементах пола, пока это не повредится. Оба этапа берут в большей части sqrt (n) броски.

Править: Можно улучшить константу в O (sqrt (n)), видеть комментарий рекурсивного. Я думаю, что первый шаг должен быть вокруг sqrt (2*n) и уменьшение 1 с каждым броском, так, чтобы последний шаг (если повреждающаяся высота на самом деле n) равнялся точно 1. Детали, которые будут вычислены читателями :)

2
ответ дан 6 December 2019 в 06:25
поделиться

Так как это - вопрос об интервью, рассмотреть

  1. Дорогая операция является восстановлением работоспособности обезьяны и вниз по лестнице, не бросающий кокос. Думая об этом этот путь, 'линейным' подходом является на самом деле N2.

  2. Энергия, переданная кокосу падением, примерно пропорциональна высоте отбрасывания. Если оболочка повреждается после поглощения некоторой суммы энергии во ВСЕМ, нем - падения...

2
ответ дан 6 December 2019 в 06:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: