0

在 PHP 中给定一个数组,其中包含正整数和/或递归嵌套的正整数数组。例如,它可以被初始化为:

$arr = array(array(141,151,161), 2, 3, array(101, 202, array(303,404)));

编写一个函数“function MaxArray($arr)”,它返回包含在 $arr 或嵌套在 $arr 中的某个数组中的最大值。在示例中,返回值应为 404。

function MaxArray($arr){

    static $x = 0;

    foreach($arr as $array){ 
   
        if(is_array($array)) $x = MaxArray($array);            
        else if($array > $x) $x = $array;
        
    }
    return $x;    
}

//additional output just for testing
$arr = array(array(141,5651,161), 2, 45446, array(101, 202, array(303,4)));
//additional output just for testing
print MaxArray($arr);

每次我运行它时它都有效,但在线代码生成器不接受。这是那里的错误还是我......?

另外,在个人笔记中,我想对 stackoverflow 上的每个人表示感谢,这样一个了不起的网站。四年前,我对编程一无所知,现在我从头开始构建视听评论,我正在用 Java 编写 Android 应用程序!

更新:这个问题取自我参加的在线测试。没有显示错误信息,但是代码生成器只是给出了错误答案的响应。因此,我没有被标记为这个问题。

我想在对决定提出上诉之前检查我的解决方案。

4

2 回答 2

1
# so... this works well enough
$arr = array(array(141,5651,161), 2, 45446, array(101, 202, array(303,4)));
print MaxArray($arr);  // outputs 45446

print "\n";

# but now...let's try it again.  In the same script.  *gasp!*
$arr2 = array(42);
print MaxArray($arr2);  // outputs 45446 (!!!)

问题是静态变量;在调用函数之间它没有被清除。所以之前的结果会影响未来的结果。这几乎肯定是不正确的,并且肯定会导致知识渊博的人类法官拒绝您的代码。

摆脱静态变量。您可以将它作为参数传递,您可以简单地与子结果进行比较,就像这里的其他答案所暗示的那样......或者您可以用闭包和array_walk_recursive. :)

function MaxArray($arr) {
    $max = -1;
    array_walk_recursive($arr, function($x) use (&$max) {
        if ($x > $max) $max = $x;
    });
    return $max;
}
于 2013-07-29T23:29:10.297 回答
0
<?php
$arr = [[141, 151, 161], 2, 3, [101, 202, [303, 404]]]

/**
 * @param $input
 * @return int
 */
function getActMax($input)
{
    if ( ! is_array($input))
    {
        return $input;
    } else
    {
        return findMax($input);
    }
}

/**
 * @param array $inputs
 * @return int
 */
function findMax(array $inputs)
{
    //Maybe the first item in the list is the biggest, this is our current max value
    $max = getActMax(current($inputs));
    foreach ($inputs as $v)
    {
        //If we found a bigger, change our max value
        if (getActMax($v) > $max)
        {
            $max = getActMax($v);
        }
    }

    return (int)$max;
}

var_dump(findMax($arr));
于 2014-10-29T23:16:50.050 回答