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

单选题:

下列关于图的应用说法错误的是(C)
A
任何一个图的连通图的最小生成树有一棵或多棵;
B
某无向连通图中没有权值相同的边,该图的最小生成树唯一;
C
某无向图中有权值相同的边,则该图最小生成树一定不唯一;
D
可利用Prim算法和Kruskal两种算法来构造图的最小生成树;
2.
计算机系统中并发是对有限的物理资源强制行使多用户共享,消除计算机部件之间的互等现象,以提高系统资源利用率,现假设某单CPU系统中有输入和输出设备各1台,现有3个并发执行的作业,每个作业的输入、 计算和输出时间均分别为2ms、3ms和4ms,且都按输入、计算和愉出的顺序执行,则执行完3 个作业需要的时间最少是( B)
A
18ms
B
17ms
C
22ms
D
23ms

FIFO为先进先出的顺序来完成页面的访问,而如果在采用先进先出页面淘汰算法的系统中,一进程在内存占3块(开始为空),页面访问序列为1、2、3、4、1、2、5、1、2、3、4、5、6。运行时会产生( D )次缺页中断?
A . 7
B .8
C.9
D.10
4.
二叉排序树又称为二叉查找树,在二叉排序树进行插入操作时,每次插入的结点都是二叉排序树上新的叶子结点,现假设分别用下列序列构造二叉排序树,与用其他三个序列所构造的结果不同的是( D )?
A
{100,70,40,90,140,150,110}
B
{100,70,90,40,140,110,150}
C
{100,140,110,150,70,40,90}
D
{100,40,70,90,140,110,150}

平常在设计数据结构的时候,经常会用到堆,以下哪个是最大堆 A
A
在这里插入图片描述

B
在这里插入图片描述

C
在这里插入图片描述

D
在这里插入图片描述

初始序列为1 2 3 4 5 6的完全二叉树,1为根节点,2,3分别为1的左右孩子,4,5分别为2的左右孩子,6为3的左孩子,采用大根堆调整后,堆所对应的中序遍历序列应为:A
A
4 5 2 6 1 3
B
6 5 4 3 2 1
C
6 5 4 2 3 1
D
4 2 5 1 3 6

有这样一个业务场景:一个请求需要一系列的处理工作,那么我们选择以下哪一种设计模式比较合适D
A
观察者模式
B
桥接模式
C
工厂模式
D
责任链模式

假设销售团队拥有一张账目表account,表中每行记录记录着销售员2016年到2018年每个月的销售额,如果销售员当月没有销售额,则不录入到表中,目前管理员想查看下2018年每个月都有销售额的销售人员的总销售额,
那么sql语句是: C

create table `account`(
    `id` int(11) not null auto_increment,
    `year` int(11) not null comment '年份',
    `name` char(30) not null comment '销售员',
    `month` int(11) not null comment '月份',
    `sales` int(11) not null comment '销售额',
    primary key(`id`)
)engine = innodb;

A

select name, sum(sales) from account where month = 12 and year = 2018 group by name having count(sales)=12 order by name asc

B

select name, sum(sales) from account where month = 12 group by name having year=2018 order by name asc

C

select name, sum(sales) from account where year = 2018 group by name having count(sales)=12 order by name asc

D

select name, sum(sales) from account group by name having year=2018 and count(sales)=12 order by name asc

在数据结构中,不同的排序方法决定了排序的时间效率,现在假设对关键字序列22、86、19、49、12、30、65、35、18做一趟排序后,得到的结果如下:18、12、19、22、49、30、65、35、86。因此,根据上述结果可以得到采用的排序方法是( C)?
A
冒泡排序
B
快速排序
C
直接插入排序
D
堆排序

一个小根堆的序列为:{5, 12, 7, 18, 31, 13, 9},删除根节点5之后,小根堆会自动调整重新变为小根堆,小根堆的最后的叶子节点为?B
A
31
B
13
C
9
D
12
E
18

先序遍历指按照根左右的顺序沿一定路径经过路径上所有的结点,现假设一颗二叉树的后序遍历为69, 67, 71, 70, 72, 68, 66, 中序遍历为69, 67, 66, 71, 70, 68, 72,则先序遍历为( D)?
A
66, 67, 68, 69, 70, 71, 72
B
66, 67, 69, 68, 70, 71, 72
C
66, 69, 67, 70, 71, 72, 68
D
66, 67, 69, 68, 71, 70, 72

对于以下代码分析

void test(int N)
{
    int i=1;
    while(i<N)
    {
        i=i*4;
    }
}

下面选项哪个最符合上面代码中循环执行的次数 C
A
0.5N
B
log2N
C
0.5log2N
D
0.2log2N
E
0.4log2N

以下程序存在何种安全漏洞?A

<tr>
<td class="font_content" align="right">交易状态:</td>
<td class="font_content" align="left"><?php echo $_GET['trade_status'];?></td>
</tr>

A
XSS
B
sql注入
C
命令执行
D
代码执行

多选题:

下面关于c++静态成员在类里面说法正确的有BDE
A
创建静态成员是为了方便对象能直接调用
B
静态成员函数里面不能使用该类的this指针
C
静态数据成员不受private控制符作用
D
静态成员函数的参数不能带有该类的this指针
E
静态成员函数不能被声明为virtual函数

看下面代码,关于运算符重载说法正确的有?BCE

class Time
{
private:
int minutes;
public:
Time operator+(const Time & t);
friend Time operator*(double clock,const Time &time);
};

A
若 Time operator+(const Time & t)重载正确,那么 Time t1; auto time= 22+t1;是一个正确的使用。
B
friend Time operator*(double clock,const Time &time),这个函数可以访问Time类的minutes变量
C
friend Time operator*(double clock,const Time &time),这个函数是一个非成员函数
D
friend Time operator*(double clock,const Time &time),这个函数传入的参数可以是3个
E
"->"只能重载为类成员函数

下面关于STL 容器的capacity()和size()属性说法正确的是:ABD
A
size是当前vector容器真实占用的大小,capacity是指预分配的内存空间
B
使用reserve()可以修改capacity的值
C
vector、string 和set都拥有capacity()和size()属性
D
容器的size一旦超过capacity的大小,vector会重新配置内部的存储器

以下C++代码,那些语句会导致编译错误?AD

#include <iostream>
class Foo {
public:
    explicit Foo(int a)
    {
        std::cout << "explicit Foo(int a)" << std::endl;
    }
    void func()
    {
        std::cout << "void func()" << std::endl;
    }
private:
    Foo(const Foo& foo)
    {
        std::cout << "Foo(const Foo& foo)" << std::endl;
    }
};
int main()
{
    Foo a;//1
    Foo b();//2
    Foo c(1);//3
    Foo d = c;//4
    return 0;
}

A.1
B.2
C.3
D.4

关于HTTP2描述正确的是ABC
A
采用文本格式创术数据
B
新增了多路复用
C
采用Header压缩
D
新增了连接的keep-alive功能
19.
修改/home下test目录以及目录下所有文件,可以支持所有人可读可写的,以下能实现的有?AB
A
chmod 777 /home/test -R
B
chmod 666 /home/test -R
C
chmod 766 /home/test
D
chmod 765 /home/test -R
20.
下列选项中,可能导致当前linux进程阻塞?AC
A
进程申请临界资源
B
该进程使用时间过长,进程调度程序让其他进程使用CPU
C
进程 从磁盘读数据
D
时间片用完了

编程题:

21.最小值
牛牛给度度熊出了一个数学题,牛牛给定数字\mathit n,m,kn,m,k,希望度度熊能找到一组非负整数\mathit a,ba,b满足(n-a)(m-b) \leq k(n−a)(m−b)≤k且\mathit a+ba+b尽量小。
度度熊把这个问题交给了你,希望你能帮他解决。

一行三个数字n,m,k  1<=n,m<=10^9,1<=k<=n*m
输出描述:输出最小的。

示例1
输入例子:
12 18 100
输出例子:
7
例子说明:
当\mathit a = 7, b = 0时候, (n-a)(m-b) = 90 \leq k = 100,此时\mathit a + b = 7是最小的解。
#include <iostream>
using namespace std;
int main()
{
    double n,m,k;
    while(cin>>n>>m>>k)
    {
        int count = 0;
        if(n*m <=k)
            cout<<0<<endl;
        if(n>m)
            swap(n,m);
        while(n--)
        {
            count++;
            if(n*m<=k)
            {
                break;
            }
        }
        
    cout<<count<<endl;
    }
    return 0;
}

度度熊的工作
老板给度度熊分配了\mathit nn个工作,第\mathit ii个工作需要耗费a^i 单位时间,每个工作必须老板给定的限制时间b^i前完成。
度度熊从0时刻开始工作,在同一时间度度熊手上只能做一件工作,度度熊想知道他是否能把所有工作都完成呢?

输入描述:
第一行一个数表示数据组数。
每组数据第一行一个数。
接下来行每行两个数表示a_i,b_i。
输出描述:
每组数据输出一行,如果度度熊能完成他的工作输出"Yes"不然输出“No”。
示例1
输入例子:
1
5
2 4
1 9
1 8
4 9
3 12
输出例子:
Yes
例子说明:
从前往后依次做每个工作即可完成。
#include<iostream>
#include<vector>
#include<algorithm>
 
using namespace std;
 
int main(){
    int k=0;
    cin>>k;
    for(int i=0;i<k;i++){
        int n=0;
        cin>>n;
        vector<pair<int,int>> a;
        for(int j=0;j<n;j++){
            int x=0,y=0;
            cin>>x>>y;
            a.push_back({x,y});
        }
        sort(a.begin(),a.end(),[](pair<int,int> x1,pair<int,int> x2){
            if(x1.second==x2.second) return x1.first<x2.first;
            return x1.second<x2.second;
        });
        int time=0;
        int j=0;
        for(;j<n;j++){
            time+=a[j].first;
            if(time>a[j].second) break;
        }
        if(j==n) cout<<"Yes"<<endl;
        else cout<<"No"<<endl;
    }
    return 0;
}

树上游戏
牛牛和牛妹在做游戏,在他们面前的桌子上有一棵树,初始\text 11号点是黑点,\mathit nn号点是白点,其他都是空点,两人轮流操作,牛牛可以选择一个黑点并把该黑点周围的某个空点染成黑色,牛妹可以选择一个白点并把该白点周围的某个空点染成白色,直到有一方不能涂了,另一方获胜。

输入描述:
第一行一个数表示数据组数
每组数据第一行一个数表示树有个节点 
接下来行每行个数,表示和点有一条边相连 
输出描述:
每组数据对应一行,如果牛牛赢则输出”niuniu",如果牛妹赢输出"niumei“。
示例1
输入例子:
2
7
3 6
1 2
3 1
7 4
5 7
1 4
4
1 4
4 2
2 3
输出例子:
niuniu
niumei
例子说明:
第一个用例树的形态如下:

在这里插入图片描述

第二个用例树的形态如下:

在这里插入图片描述

#include<iostream>
#include<vector>
#include<queue>
#include<unordered_map>
#include<unordered_set>
using namespace std;
struct node {
    int cur_node;
    int pre_node;
    int deep;
    node(int a, int b, int c) :cur_node(a), pre_node(b), deep(c) {}
    node():cur_node(0),pre_node(0),deep(0){}
};
pair<int, int> find_way(vector<vector<int>>& map, int n)    // 寻找边界节点
{
    queue<node> queue;
    node tmp(0, -1, 0);
    queue.push(tmp);
    unordered_map<int, node> visited;
    visited[0] = tmp;
    while (!queue.empty())
    {
        tmp = queue.front();
        queue.pop();
        if (tmp.cur_node == n - 1)        // 到达节点n终止bfs
            break;
        for (int i = 0; i < map[tmp.cur_node].size(); i++)
        {
            int t = map[tmp.cur_node][i];
            if (t == 0)
                continue;
            if (visited.find(i) != visited.end())
                continue;
            node next(i, tmp.cur_node, tmp.deep + 1);
            visited[i] = next;
            queue.push(next);
        }
    }
    node fin_node = visited[n - 1];    // 倒推回去找途径的节点
    int op_num = (fin_node.deep - 1) / 2;    //计算牛妹拥有的节点数
    int cnt = 0;
    node cur = fin_node;
    while (cnt != op_num)
    {
        int pre_num = cur.pre_node;
        cnt++;
        cur = visited[pre_num];
    }
    return pair<int, int>(cur.cur_node, cur.pre_node);    // 返回牛牛和牛妹的边界节点
}
int bfs(vector<vector<int>>& map, int start, int bound, int n)    //计算两人各拥有的空白节点数
{
    unordered_set<int> visited;
    queue<int> queue;
    int cnt = 0;
    queue.push(start);
    visited.insert(start);
    while (!queue.empty())
    {
        int cur_node = queue.front();
        queue.pop();
        for (int i = 0; i < map[cur_node].size(); i++)
        {
            int t = map[cur_node][i];
            if (t == 0 || i == bound)
                continue;
            if (visited.find(i) != visited.end())
                continue;
            cnt++;
            visited.insert(i);
            queue.push(i);
        }
    }
    return cnt;
}
int main()
{
    int T;
    cin >> T;
    for (int tt = 0; tt < T; tt++)
    {
        int n;
        cin >> n;
        vector<vector<int>> map(n);
        int x, y;
        for (int i = 0; i < n - 1; i++)    // 建无向图
        {
            cin >> x >> y;
            map[x - 1].emplace_back(y - 1);
            map[y - 1].emplace_back(x - 1);
        }
        auto bound_node = find_way(map, n);
        int niuniu = bfs(map, 0, bound_node.first, n);
        int niumei = bfs(map, n - 1, bound_node.second, n);
        if (niuniu > niumei)
            cout << "niuniu" << endl;
        else cout << "niumei" << endl;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值