Напишите функцию в php, чтобы узнать количество прыжков, которые заключенный делает, чтобы убежать из тюрьмы.
Заключенный убегает из тюрьмы, перепрыгивая через стену. Он может прыгать на х метров высоты, но после каждого прыжка он проскакивает на метры.
Функция должна принимать четыре аргумента :
Например: ( 10,1,11,2 ):
Это означает, что заключенный может прыгать на 10 метров в высоту .
Он проскальзывает на 1 метр после каждого прыжка, который он совершает.
Высота стены – 11 метров.
Есть 2 стены .
Результатом этого вопроса должно быть: 4 (моя догадка)
Объяснение:
В первом прыжке он достигает 10-метровой высоты, но скользит вниз на 1 метр, поэтому высота прыжков в высоту составляет 9 метров, затем во втором прыжке он начинается с этой 9-метровой точки и делает еще один и успешно удается подняться на первую стену. Чтобы подняться на вторую стену, он снова должен пройти тот же процесс.
Я плохо разбираюсь в математике. Вот почему я не мог понять, как собрать их вместе и выработать уравнение из них.
Этот вопрос задавали, когда я выступал в качестве более свежего разработчика php. Вы считаете, что вопрос такого вопроса для более свежего был оправдан?
На самом деле не проверяет ваши знания php, но определенно проверяет ваши навыки решения проблем. Я бы сказал, что это довольно разумный вопрос, который следует задать на собеседовании.
function returnCounts($jump,$slip,$height,$walls) { $count = 0; while(true) { $count++; $height -= $jump; if ($height <= 0) { return $walls * $count; } else { $height += $slip; } } }
Я не тестировал это, но что-то вроде этого должно работать
Я бы предположил, что они хотели, чтобы вы поняли, что есть способ сделать это, не написав цикл, чтобы «имитировать» побег заключенного.
Очевидно, что если бы не было «скольжения», это было бы тривиально –
return ceil($wallheight / $jumpheight) * $walls;
Слип, похоже, забрасывает ключ в это уравнение, но когда вы рассматриваете краевые случаи, становится очевидным, что с ним можно легко справиться. Что произойдет, если он прыгнет 5, но проскальзывает 4? Предположим, что высота стены равна 10. Переместитесь на 5, проскользните до 1. Перейдите к 6, проскользните до 2. Перейдите к 7, проскользните до 3. Перейдите к 8, проскользните до 4. Перейдите к 9, проскользните до 5. Перейдите и выйдите ,
Таким образом, мы можем просто удалить высоту прыжка из стены, а затем разделить остаток на разницу между его прыжком и его скольжением (округление). Не забывайте (как и я!), Чтобы добавить этот «последний прыжок»!
function count_jumps($jumpheight, $slipheight, $wallheight, $walls) { if($jumpheight > $wallheight) return $walls; else return (ceil(($wallheight - $jumpheight) / ($jumpheight - $slipheight)) + 1) * $walls; }
Изменить: Исправлено.
Изменить 2: Обратите внимание, что эта функция может создавать ошибки или отрицательные результаты, но все они будут в ситуациях, когда возвращаемое значение будет бесконечным или неопределенным (slip> = jump). В ситуации интервью вы должны спросить своего интервьюера, как они хотели бы, чтобы эти дела обрабатывались.
С помощью некоторой базовой алгебры вы можете устранить необходимость в любых циклах:
function findJumps($jump_height, $slip, $wall_height, $walls) { return $walls * ($jump_height > $wall_height) ? 1 : ceil(($wall_height - $slip) / ($jump_height - $slip)); }
Объяснение:
За каждый прыжок заключенный заставляет его $jump_height
но теряет $slip
по высоте, поэтому его изменение высоты может быть представлено как $jump_height - $slip
. Чтобы узнать, сколько прыжков на стену просто разделите высоту стены на изменение высоты $wall_height / ($jump_height - $slip)
. Поскольку возможно, что результата этого нет даже, мы должны округлить с ceil()
(например, если вы прыгнули на 2 фута, а стена была 3 фута высотой, вам нужно было бы сделать два прыжка, чтобы полностью очистить стены). Просто умножьте это на количество стен, которые он должен масштабировать.
Все текущие ответы, по-видимому, игнорируют проверку ввода, поскольку некоторые из них подвержены бесконечным циклам.
Чтобы предотвратить это, выполните некоторые проверки ошибок, прежде чем пытаться обработать ввод. Вот две версии, которые я мог бы придумать, первая использует прямую реализацию цикла, вторая использует математику.
Примечание. Возможно, все еще есть ошибки, я не тестировал их на 100%.
function escape( $max_height, $slip, $wall_height, $num_walls) { // Check for infinite loop if( ($max_height - $slip) <= 0) { // Return a value to let caller know an error has occurred return -1; } $jumps = 0; while( $num_walls > 0) { $current_height = 0; do { $current_height += $max_height; $jumps++; } while( ($wall_height - $current_height) >= 0); $num_walls--; } $jumps = ($wall_height % $max_height == 0) ? ($jumps - 1) : $jumps; return $jumps; }
И теперь, без петель:
function escape2( $max_height, $slip, $wall_height, $num_walls) { // Check for valid input if( ($max_height - $slip) <= 0) { return -1; } if( $wall_height <= 0) { return 0; } $jumps = ceil( abs( $wall_height - ($max_height - $slip))); return ($jumps == 0) ? $num_walls : ($jumps * $num_walls); }
Протестируйте их , пришлите мне несколько отчетов об ошибках. 🙂
Это аналитическая алгоритмическая задача.
Псевдокод:
prisonBreak(x,y,z,t): loop t times: // number of walls set x,y,z again for next iteration //here or at the end. while(can jump): // can jump = x<z where z is adjusted after each jump z=jump // adjust remaining distance after jump. countJumps++ // increment jump count.