某浪PHP面试题及答案优化

前几天一网友去国内某知名IT公司某浪面试PHP,在他谈心得的时候得一面试题,下面写问题答案及优化方案,希望大家多提提意见。

神马,杨辉三角? 

我估计太久不上学了,当年初中数学及大学C语言课上的杨辉三角完全忘了是什么东西了。而题目恰恰就是:

问:“用PHP输出杨辉三角”

经过一阵冥思苦想... ... 什么杰宝的杨辉三角小裤裤啊!!!!问度娘去!!!


度娘告我:“杨辉三角有曲折的历史和一系列的特征,其中最直观和常用的特征是:每个数字等于上一行的左右两个数字之和。

ok,要得出答案,构造函数 f(n)即可。

度娘给出了由二级C语言上机题改造的PHP答案:

 

$a[0][0] = 1;
$row = 10; //所要输出的行号
for ($i = 0; $i < $row; $i++) {
    for ($j = 0; $j <= $i; $j++) {
        if($j == 0 || $i == $j){
            print $a[$i][$j] = 1;
        } else {
            print $a[$i][$j] = $a[$i-1][$j-1] + $a[$i-1][$j];
        }
         
        print ' ';
    }
    print "\n";
}


它使用了一个二维数组和两层迭代。但我稍加分析后,认为,二维数组完全是浪费,我们只需要关心a[n-1]的数据就足够了,其他的数据完全是打酱油的。本着勤俭持家,节约光荣的优良思想,我将程序改造如下:

 

 

$b = $c = array(1);
$row = 10;
for ($i = 0; $i <= $row; $i++) {
    $j = -1;
    while (++$j < $i)
        echo $c[$j] = ($j == $i) ? 1 : (double)$b[$j-1] + $b[$j], ' ';
    echo PHP_EOL;
    $b = $c;
}

 

经过测试,在$row = 1000时,结果如下:

前者:
<!--执行时间:2428ms,使用内存:42217KB-->
后者:
<!--执行时间:1953ms,使用内存:411KB-->


(⊙_⊙), good job!



记:PHP5.4之前版本 三元表达式在大数组运算中会有性能问题,原因及解决请参考:http://www.laruence.com/2011/11/04/2258.html

 

posted @ 2013-07-08 15:24  xinyuyuanm  阅读(200)  评论(0编辑  收藏  举报