2020百度校招C++/PHP方向笔试大题(部分)

前言:本人使用php编程语言编写

一:  小度帮同事买饮料,每个同事都会告诉小度要喝什么类型的饮料,店家正好做买一送一活动,每买一瓶任意类型饮料可以赠送同类型饮料一瓶,请问小度至少需要买几瓶饮料。

1.第一行输入两值:a,b。(a代表同事人数,且a>=0。b代表商店一共有多少种类型饮料,0<=b<=1000)(具体限制记不太清,不影响结果)

2.第二行输入a个值,代表每个同事想要喝的饮料类型。

例:(具体例子记不清,随便给个)

输入:

5 3

1 2 2 1 2

输出:

3

<?php
// 买饮料。

while (fscanf(STDIN, "%d%d", $a, $b) == 2) { 
    fscanf(STDIN, "%[^\n]s", $line);
    //split line to array
    $numbers = explode(" ", trim($line));
    if(count($numbers) == $a && max($numbers) <= $b){
        //将结果数组按值分类计数
        $numbers = array_count_values($numbers);
        $re = 0;
        foreach ($numbers as $number){
            //取进位整数
            $re += ceil($number / 2.0);
        }
        printf("%d\n",$re);
    }
}

 

二:小度所在的队伍执行任务,路上遇到三岔路口。军官有过吩咐,遇到三叉路口如果队伍可以分成两队,且两队人数差是b人,则分成两队向不同的路口继续走,若队伍无法按要求分成两队,则在此地扎营,问队伍一共扎了几处营地。

1.第一行输入a,b两个值,a代表队伍总人数,b代表分队的人数差。

例:

输入:

10 2

输出:

5

说明:          10

                    /    \

                  4       6

                /   \     /  \

              1     3  2    4

                             /   \

                           1     3

<?php
// 三岔路口摆地摊。

while (fscanf(STDIN, "%d%d", $a, $b) == 2) {  
    $re = test($a,$b,0);
    printf("%d\n",$re);
}

function test($a,$b,$c){
    $re = 0;
    //如果队伍人数少余(差值+1),直接扎营
    if($a <= $b+1){
        return $c+1;
    }
    //如果队伍人数减去差值可以被2整除(即可以分成两队)就分队
    if(($a-$b)%2 == 0){
        //递归扎营
        $re += test(($a-$b)/2,$b,$c);
        $re += test(($a-$b)/2+$b,$b,$c);
        return $re;
    }else{
        return $c+1;
    }
}

 

三:小度摆放火柴 1-9 九个数字,1 2 3 4 5 6 7 8 9 分别需要使用 2 5 5 4 5 6 3 7 6根火柴,给小度n根火柴,小度能摆出的最大数字是多少(火柴需全部使用完)

1.第一行输入a,b两个值,a代表给小度的火柴总数,b代表小度可以摆放的数字个数。

2.第二行输入b个值,代表小度可以摆放的数字。

例:

输入:

20 4

3 4 7 8

输出:

777773

没写出来,尬

 

结语:经过这次笔试测试,也是发现了自己很多不足。小题很多是关于数据结构的树、图那些,很可惜好久没复习忘得差不多了。大题最后一个没写出来也是有点遗憾。再接再厉吧。

如果你看到了并知道最后一题答案,也欢迎留言。

(题目均根据记忆写出来,如跟原题目有小差误也请谅解。任何问题可以留言。)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章