在 php 中编写一个函数,以找出囚犯逃离监狱的跳跃次数。
一名囚犯跳过一堵墙逃离监狱。他可以跳 x 米的高度,但每次跳跃后他都会滑 y 米。
该功能应采用四个参数:
例如:( 10,1,12,2 ):
这意味着囚犯可以身高跳 10 米。 每次跳跃后,他滑下 1 米 墙高 11 米 2 墙。
此问题的输出应为: 4 (我的猜测)
说明:
在他的第一次跳跃达到10米高度但滑落1米所以有效跳跃高度是9米,然后在第二跳他从9米点开始并且使再一次成功地爬上了第一堵墙。要爬上第二面墙,他必须再次经历同样的过程。
我不擅长数学。这就是为什么我无法弄清楚如何将它们组合在一起并从中得出方程式。
当我申请成为更新的php开发人员时,问了这个问题。你认为将这类问题提到一个更新的是合理的吗?
答案 0 :(得分:3)
不是真的测试你的PHP知识,但绝对测试你的问题解决技巧。我想在面试时提出这是一个非常合理的问题。
function returnCounts($jump,$slip,$height,$walls)
{
$count = 0;
while(true)
{
$count++;
$height -= $jump;
if ($height <= 0)
{
return $walls * $count;
}
else
{
$height += $slip;
}
}
}
我没有对此进行过测试,但这样的事情应该可行
答案 1 :(得分:2)
我猜他们想让你弄清楚有没有办法做这个而不用写一个循环来“模拟”囚犯逃跑。
显然,如果没有“滑倒”,那将是微不足道的 -
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&gt; = jump)。在面试的情况下,你应该问你的面试官他们希望如何处理这些案件。
答案 2 :(得分:1)
使用一些基本代数,您可以消除对任何循环的需要:
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英尺,你需要完全跳两次)清除墙壁)。简单地将它乘以他必须缩放的墙数。
答案 3 :(得分:1)
所有当前的答案似乎都忽略了输入检查,因为有些人容易受到无限循环的影响。
为防止这种情况,请在尝试处理输入之前进行一些错误检查。以下是我可以提出的两个版本,第一个使用简单的循环实现,第二个使用数学。
注意:可能仍有错误,我没有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);
}
Test them out,给我一些错误报告。 :)
答案 4 :(得分:0)
这是分析算法任务。
伪码:
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.