百度2020校招C++/PHP研发工程师笔试卷(第三批)

单选

1.
下列关于关键路径的叙述中错误的是(D)
A
关键路径是指在带权有向图中从源点到汇点的所有路径中具有最大路径长度的路径;
B
关键路径上的所有活动都是关键活动,可通过加快关键活动来缩短整个工程的工期;
C
AOE网中,关键路径上活动的时间延长多少,整个工程的时间也就随之延长多少;
D
AOE网中的关键路径并不唯一,可通过加快某一条关键路径中关键活动速度来缩短整个工程工期;
单选题
2.
对于数列4、5、6、7、9、12、18、23,如果采用折半查找元素9,请问需要查找几次?(B)
A
2
B
3
C
4
D
5
单选题
3.
一棵二叉树的前序遍历结果为ABCDEFG,则其中序遍历结果不可能为?(D)
A
CBDAFEG
B
CBAEDGF
C
CBAEDFG
D
CBFADEG
单选题
4.
现有一字符串"hello world",使用哈夫曼编码最少使用多少bit内存:(B)
A
4
B
32
C
64
D
88
单选题
5.
已知现有一个大小为4初始状态为空的栈,现在有一组数据经过这个栈后,最终的数据顺序是:2 5 4 1 3,问原始的进栈数据不可能是以下的哪组D
A
1 4 5 2 3
B
5 2 3 1 4
C
3 4 5 2 1
D
4 1 3 5 2
单选题
6.
浏览器的事件模型使用了下面哪种设计模式的概念?A
A
发布者/订阅者模式
B
原型模式
C
中介者模式
D
代理模式
单选题
7.
假设有必修课成绩表course,每位学生的期末考试成绩以及补考成绩都录入到course表中,学号为20190001的同学想查询一下自己未通过的课程的课程编号与课程名称,那么下面正确的sql语句是C
create table course(
id int(11) not null auto_increment,
sid int(11) not null comment ‘学号’,
cid int(11) not null comment ‘课程编号’,
cname char(50) not null comment ‘课程名称’,
score int(11) not null comment ‘分数’,
primary key(id)
)engine = innodb;

A
select distinct cid,cname from course where cid not in (select cid from course where score > 60 and sid=20190001)
B
select distinct cid,cname from course where cid in (select cid from course where score < 60) and sid=20190001
C
select distinct cid,cname from course where cid not in (select cid from course where score > 60) and sid=20190001
D
select distinct cid,cname from course where cid in (select cid from course where score < 60 and sid=20190001)
单选题
8.
序列{20, 23, 28, 41, 61, 31, 71, 76, 15, 30}构造为完全二叉树,完全二叉树再变为最小堆后,堆所对应的的中序遍历序列可能为(B)
A
76, 23, 41, 61, 20, 30, 31, 15, 28, 71
B
76, 23, 41, 20, 61, 30, 15, 31, 28, 71
C
76, 20, 41, 23, 30, 61, 15, 31, 28, 71
D
76, 23, 20, 41, 61, 15, 31, 20, 28, 71
单选题
9.

#include <iostream>
class Parent {
    public:
        Parent() { std::cout << "1"; }
        Parent(const Parent &p) { std::cout << "2"; }
            const Parent &operator=(const Parent &p) {
            std::cout << "3";
        return *this;
    }
};
int main() {
    Parent p;
    Parent p1(p);
    Parent p2 = p;
    p2 = p1;
}

以上代码的输出为:B
A
1123
B
1223
C
1233
D
1322
E
1332
单选题
10.
有如下递归函数 test(n),其时间复杂度为多少?E

int  test(int n) {
    if (n <= 1) return 1;
    return (2 *  test(n - 1) + 3 *  test(n - 2));
}

A
O(logn)
B
O(nlogn)
C
O(n^2)
D
O(n^3)
E
O(2^n)
单选题
11.
关于以下代码说法正确的有?B

#include <iostream>
using namespace std;
class A {
public:
    virtual void testA() = 0;
    virtual void print() = 0;
};
class B :public A
{
public:
    virtual void testA() = 0;
    virtual void print() override
    {
        std::cout << "B::print" << std::endl;
    }
    virtual void testB()
    {
        std::cout << "testB" << std::endl;
    }
};
class C :public B
{
public:
    virtual void testA(){}
    virtual void print() override
    {
        std::cout << "C::print" << std::endl;
    }
};
int main() {
    C c;
    c.print();
    c.testB();
    return 0;
}

A
会出现编译出错
B
会成功输出C::print 以及 testB
C
main函数里可以生成B的对象,代码不会报错
D
main函数里可以生成A的对象,代码不会报错
单选题
12.
假设磁头当前位于116道,正在向磁道序号增加的方向移动。现有一个磁道访问请求序列为48, 59, 37, 81, 125, 195, 185, 205采用电梯调度SCAN算法得到的磁道访问序列是:A
A
125, 185, 195, 205, 81, 59, 48, 37
B
125, 185, 195, 205, 37, 48, 59, 81
C
37, 48, 59, 81, 125, 185, 195, 205
D
125, 195, 185, 205, 48, 59, 37, 81
单选题
13.
属于同一进程的两个线程 T1和 T2并发执行,共享初值为 0 的全局变量 X。T1和 T2实现对全局变量 x 加 1 的伪代码分别如下:
T1:
temp1=X;
temp1=temp1+1;
X=temp1;
T2:
temp2=X;
temp2=temp2+1;
X=temp2;
2个线程进行到任意一步都能被对方打断,执行另外一个线程的代码,请问在所有可能的执行序列中,使 x 的值为 2 的序列个数有几种?B
A
1
B
2
C
3
D
4
E
5
单选题
14.
shell脚本中,需求如下:如果 ls /tmp 执行成功输出True,否则输出Fail,下列哪项正确 D
A
ls /tmp; [[ $# -eq 0 ]] && echo True || echo Fail
B
ls /tmp; [[ $* -eq 0 ]] && echo True || echo Fail
C
ls /tmp; [[ $0 -eq 0 ]] && echo True || echo Fail
D
ls /tmp; [[ $? -eq 0 ]] && echo True || echo Fail
多选题
15.
在C++中,"std::cout"中的"std"和"cout"分别是什么?BE
A

B
命名空间
C
运算符
D
函数
E
对象
F
模板

多选题

16.
假设一个数组采用快速排序,则下面的选项中,不可能是第3趟排序结果的是ACD
A
4, 8, 6, 10, 12, 16, 14
B
10, 4, 6, 8, 12, 14, 16
C
8, 4, 6, 12, 10, 14, 16
D
4, 8, 6, 12, 10, 16, 14
多选题
17.
c++以下哪些情况会调用拷贝构造函数?BCD
A
初始化构造一个函数
B
当类的一个对象去初始化该类的另一个对象
C
函数的形参是类的对象
D
函数的返回值是类对象
E
类的一个对象加上该类的另一个对象
多选题
18.
某进程创建的若干个线程,这些线程不能共享的是AB
A
程序计数器
B
某线程的栈指针
C
进程打开的文件
D
全局变量
E
进程的堆空间
多选题
19.
tcp发送报文数据时,可能将多个数据包合并成一个大的数据包发送,就有可能发生粘包问题。以下可以用来解决这个问题的是?ABD
A
发送固定长度的消息
B
包结尾增加分隔符
C
慢开始算法
D
把消息分成消息头和消息体,其中消息头上包含长度
E
利用滑动窗口实现控制
多选题
20.
下列PHP变量中命名合法是(BCD)
A
$1abc
B
$_1abc
C
$哈哈abc
D
$abc1

编程题

21.
最小公倍数与最大公约数
度度熊请你找出两个数\mathit a,ba,b,满足1 \leq a,b \leq n1≤a,b≤n且\mathit lcm(a,b)-gcd(a,b)lcm(a,b)−gcd(a,b)尽量大。输出最大的\mathit lcm(a,b)-gcd(a,b)lcm(a,b)−gcd(a,b).
其中\mathit lcm(a,b)lcm(a,b)表示\mathit aa和\mathit bb的最小公倍数,\mathit gcd(a,b)gcd(a,b)表示\mathit aa和\mathit bb的最大公约数。


	#include <iostream>
using namespace std;
int main(){
    long long n;
    cin>>n;
    cout<<n*(n-1)-1;
}

22.
石子游戏
今天,度度熊和牛妹在玩取石子的游戏,开始的时候有n堆石头,第i堆有a^i个石头,两个人轮流动作,度度熊先走,在每个回合,玩家选择一个非空堆,并从堆中移除一块石头。如果一个玩家在轮到他之前所有的石碓都是空的,或者如果在移动石头之后,存在两个堆包含相同数量的石头(可能为都为0),那么他就会输。假设两人都在游戏时选择最佳方式,度度熊和牛妹谁会赢?如果度度熊获胜,输出“man”,如果牛妹获胜,输出“woman”(输出不包含双引号)。

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main(){
    int n;
    cin >> n;
    for(int i = 0; i < n; i++){
        int m;
        cin >> m;
        vector<int> a(m);
        for(int j = 0; j < m; j++) cin >> a[j];
        // 只有一堆, 奇偶决定胜负
        if(m == 1){
            if((a[0] & 1) == 0)cout << "woman\n";
            else cout << "man\n";
            continue;
        }
        
        // 多堆, 需要排序
        sort(a.begin(), a.end());
        
        // 全为零, 先手直接败
        if(a.back() == 0){
            cout << "woman\n";
            continue;
        }
        
        // 排序后, 统计相邻数字相同的对数
        int close_count = 0;
        for(int j = 0; j < m - 1; j++){
            if(a[j] == a[j + 1]) close_count++;
            if(close_count > 1) break;
        }
        // 该数目大于1, 则先手败
        if(close_count > 1){
            cout << "woman\n";
            continue;
        }
        // 如果只有一对, 检查左右是否都只差1
        if(close_count == 1){
            int j;
            for(j = 0; j < m - 1; j++) if(a[j] == a[j + 1]) break;
            if((j - 1 >= 0 && a[j] - a[j - 1] == 1) || (j + 2 < m && a[j + 2] - a[j + 1] == 1)){
                cout << "woman\n";
                continue;
            }
        }
        
        // 一般情况
        bool even = true;
        for(int j = 0; j < m; j++) if(((a[j] - j) & 1) == 1) even = !even;
        if(even) cout << "woman\n";
        else cout << "man\n";
    }
}

23.
穿越银河
在浩瀚深邃的星空中,有若干个可以被视为质点的星球,以及坐着飞船想要探索宇宙奥秘的度度熊。
我们假定银河是一个n×m的区域,顶点在(0,0)和( n,m),度度熊从最左边任意一点进入,打算穿越这片区域并从右边任意一点离开。在银河中分布着k个星球,每个星球以及银河的上下两个边缘都有引力,处于安全考虑,度度熊要离他们越远越好。
试求度度熊穿越银河的路径上,距离所有星球以及上下边界的最小距离的最大值可以为多少?

#include <iostream>
#include <iomanip>
#include <sstream>
#include <array>
using namespace std;

const int KMAX = 6000, PRECISION = 4;
array<int, KMAX> x, y, parents;
array<bool, KMAX> cover_up, cover_down;  // 星球引力范围是否与边界引力范围相接
array<array<double, KMAX>, KMAX> distance_squares;

// 计算距离平方
double get_distance_square(int x1, int y1, int x2, int y2){
    return (double)(x1 - x2) * (x1 - x2) + (double)(y1 - y2) * (y1 - y2);
}

int find_set(int x){
    if(x != parents[x]) parents[x] = find_set(parents[x]);
    return parents[x];
}

// 将cover_up和cover_down也合并, 并且如果合并后上下边界都覆盖, 返回true
bool union_set(int x1, int x2){
    int p1 = find_set(x1), p2 = find_set(x2);
    parents[p2] = p1;
    cover_up[p1] |= cover_up[p2];
    cover_down[p1] |= cover_down[p2];
    return cover_up[p1] && cover_down[p1];
}

bool digits_same(double d1, double d2, int precision){
    stringstream stream1, stream2;
    stream1 << fixed << setprecision(4) << d1;
    stream2 << fixed << setprecision(4) << d2;
    return stream1.str() == stream2.str();
}

int main(){
    int n, m, k;
    cin >> n >> m >> k;
    for(int i = 0; i < k; i++) cin >> x[i] >> y[i];

    // 计算各点间距离平方
    for(int i = 0; i < k; i++)
        for(int j = i + 1; j < k; j++)
            distance_squares[i][j] = get_distance_square(x[i], y[i], x[j], y[j]);

    double low = 0, high = m / 2.0;

    // 二分法
    while(!digits_same(low, high, PRECISION)){
        double mid = (high + low) / 2, rr = 4 * mid * mid;
        bool can_go_through = true;  // 标记使用mid是否能穿越

        // 初始化并查集
        for(int i = 0; i < k && can_go_through; i++){
            parents[i] = i;
            cover_up[i] = y[i] + mid > m - mid;
            cover_down[i] = y[i] - mid < mid;
            if(cover_up[i] && cover_down[i]) can_go_through = false;
        }

        // 用n^2时间将星球合并, 若合并过程中发现有集合cover_up且cover_down, 则不能穿越
        for(int i = 0; i < k && can_go_through; i++)
            for(int j = i + 1; j < k && can_go_through; j++)
                if(distance_squares[i][j] < rr)
                    if(union_set(i, j))
                        can_go_through = false;

        // 根据结果设置low或high
        if(can_go_through) low = mid;
        else high = mid;
    }

    // 结果保留4位小数
    cout << fixed << setprecision(PRECISION) << low;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值