2020-01-19

php 有趣的面试题目

1. 兔子问题 (斐波那契数列,即 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ……)。 有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,请编程输出两年内每个月的兔子总数为多少?

function _Fibonacci($n)
{
    $one = 1;
    $two = 1;
    $count = 1;
    if ($n < 3) {
        return;
    }
    for ($i = 3; $i <= $n; $i++) {
        $count = $one + $two;
        $two = $one;
        $one = $count;
        echo "第" . $i . "个月的兔子数:" . $count . "<br>";
    }
    return $count;
}

_Fibonacci(24);
输出效果如下:
第3个月的兔子数:2
第4个月的兔子数:3
第5个月的兔子数:5
第6个月的兔子数:8
第7个月的兔子数:13
第8个月的兔子数:21
第9个月的兔子数:34
第10个月的兔子数:55
第11个月的兔子数:89
第12个月的兔子数:144
第13个月的兔子数:233
第14个月的兔子数:377
第15个月的兔子数:610
第16个月的兔子数:987
第17个月的兔子数:1597
第18个月的兔子数:2584
第19个月的兔子数:4181
第20个月的兔子数:6765
第21个月的兔子数:10946
第22个月的兔子数:17711
第23个月的兔子数:28657
第24个月的兔子数:46368
//递归法
function _Fibonacci($n)
{
    if ($n == 1 || $n == 2) {
        return 1;
    } else {
        return _Fibonacci($n - 1) + _Fibonacci($n - 2);
    }
}
for ($i = 1; $i <= 24; $i++) {
    echo "第" . $i . "个月的兔子数:" . (_Fibonacci($i)) . "<br>";
}
输出效果如下:
第1个月的兔子数:1
第2个月的兔子数:1
第3个月的兔子数:2
第4个月的兔子数:3
第5个月的兔子数:5
第6个月的兔子数:8
第7个月的兔子数:13
第8个月的兔子数:21
第9个月的兔子数:34
第10个月的兔子数:55
第11个月的兔子数:89
第12个月的兔子数:144
第13个月的兔子数:233
第14个月的兔子数:377
第15个月的兔子数:610
第16个月的兔子数:987
第17个月的兔子数:1597
第18个月的兔子数:2584
第19个月的兔子数:4181
第20个月的兔子数:6765
第21个月的兔子数:10946
第22个月的兔子数:17711
第23个月的兔子数:28657
第24个月的兔子数:46368

2. 打印杨辉三角
1  
1  1  
1  2  1  
1  3  3  1  
1  4  6  4  1  
1  5  10  10  5  1  
1  6  15  20  15  6  1  
1  7  21  35  35  21  7  1  
1  8  28  56  70  56  28  8  1  
1  9  36  84  126  126  84  36  9  1  

function _Triangle($n)
{
    $arr = array();
    for ($i = 1; $i <= $n; $i++) {
        for ($j = 1; $j <= $i; $j++) {
            if ($j == 1 || $j == $i) {
                echo $arr[$i][$j] = 1;
            } else {
                echo $arr[$i][$j] = $arr[$i - 1][$j - 1] + $arr[$i - 1][$j];
            }
            echo "  ";
        }
        echo "<br/>";
    }
}

_Triangle(10);

3. 五种方法获取文件路径文件后缀名

$str = "/data/www/wordpress/wp-content/themes/twentyten/images/info.png";
// 字符串切割 strrchr返回从该位置到字符串结尾的所有字符
function get_ext1($str)
{
    return substr(strrchr($str, "."), 1);
}

// 使用 pathinfo
function get_ext2($str)
{
    $p = pathinfo($str);
    return $p['extension'];
}

// 字符串切割 strrpos字符串在另一字符串中最后一次出现的位置
function get_ext3($str)
{
    return substr($str, strrpos($str, '.') + 1);
}

// 使用 array_pop 出栈数组中的最后一个元素
function get_ext4($str)
{
    $arr = explode('.', $str);
    return array_pop($arr);
}

// 使用 pathinfo 及其常量
function get_ext5($str)
{
    return pathinfo($str, PATHINFO_EXTENSION);
}

echo get_ext1($str) . PHP_EOL . "</br>";
echo get_ext2($str) . PHP_EOL . "</br>";
echo get_ext3($str) . PHP_EOL . "</br>";
echo get_ext4($str) . PHP_EOL . "</br>";
echo get_ext5($str) . PHP_EOL . "</br>";

4. 快速排序

function quick_sort($array)
{
    if (count($array) <= 1) {
        return $array;
    }
    $key = $array[0];
    $left_arr = array();
    $right_arr = array();
    for ($i = 1; $i < count($array); $i++) {
        if ($array[$i] <= $key) {
            $left_arr[] = $array[$i];
        } else {
            $right_arr[] = $array[$i];
        }
    }
    //var_dump($left_arr, $right_arr);
    $left_arr = quick_sort($left_arr);
    $right_arr = quick_sort($right_arr);
    $res = array_merge($left_arr, array($key), $right_arr);
    //var_dump($res);
    return $res;
}

$arr1 = [12, 123, 35, 65, 98, 6, 43, 21, 3, 77];
$res = quick_sort($arr1);
var_dump($res);
结果如下:
array (size=10)
  0 => int 3
  1 => int 6
  2 => int 12
  3 => int 21
  4 => int 35
  5 => int 43
  6 => int 65
  7 => int 77
  8 => int 98
  9 => int 123

5. 打印如下的字符图形
a a a
aa aa aa
aaa aaa aaa
……

$len = 5;
$str = "a";
for ($i = 1; $i <= $len; $i++) {
    $str1 = '';
    for ($k = 0; $k < $i; $k++) {
        $str1 .= $str;
    }
    for ($j = 0; $j < 3; $j++) {
        echo $str1 . " ";
    }
    echo "<br>";
}

6. 打印如下的字符图形
1
2 22
3 33 333
4 44 444 4444
5 55 555 5555 55555
……

$height = 8;
for ($i = 1; $i <= $height; $i++) {
    $str = '';
    for ($k = 0; $k < $i; $k++) {
        $str .= $i;
        echo $str . " ";
    }
    echo "<br>";
}

7. 打印如下图形
                             #
                           ###
                         #####
                       #######
                     #########
                       #######
                         #####
                           ###
                             #

$ii = 9;
for ($i = 1; $i <= $ii; $i++) {
    if ((2 * $i - 1) > $ii) {
    } else {
        for ($j = 2 * ($ii - $i) - 1; $j > 0; $j--) {
            echo "&nbsp;";
        }
        for ($j = 0; $j < 2 * $i - 1; $j++) {
            echo '#';
        }
        echo "<br>";
    }
}
$k = floor($ii / 2);
for ($j = $k; $j > 0; $j--) {
    for ($l = 2 * ($ii - $j) - 1; $l > 0; $l--) {
        echo "&nbsp;";
    }
    for ($kk = 2 * $j - 1; $kk > 0; $kk--) {
        echo '#';
    }
    echo "<br>";
}

8. 两个数组交叉合并到一个新的数组,如:
$a = [1,2,3];
$b = [‘a’, ‘b’, ‘c’];
合并后 $c = [1, ‘a’, 2, ‘b’, 3, ‘c’]

$a = [1, 2, 3];
$b = ['a', 'b', 'c'];
$i = $j = 0;
$len = count($a) + count($b);
$arr = [];
for ($k = 0; $k < $len; $k++) {
    if ($k % 2 == 0) {
        array_push($arr, $a[$i]);
        $i++;
    } else {
        array_push($arr, $b[$j]);
        $j++;
    }
}
var_dump($arr);

发表回复

Your email address will not be published. Required fields are marked *