2017百度实习生招聘编程题

这篇博客介绍了百度实习生招聘中涉及的编程题目,包括单词接龙、页面调度算法和短作业优先调度策略。提供了输入输出示例以及思路分析,旨在帮助应聘者理解和解决这类算法问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目1:单词接龙

题目描述:拉姆刚开始学习英文单词,对单词排序很感兴趣。如果给拉姆一组单词,他能够迅速确定是否可以将这些单词排列在一个列表中,使得该列表中任何单词的首字母与前一单词的为字母相同。
你能编写一个程序来帮助拉姆进行判断吗?
输入描述:输入包含多组测试数据。对于每组测试数据,第一行为一个正整数n,代表有n个单词。然后有n个字符串,代表n个单词。保证:2<=n<=200,每个单词长度大于1且小于等于10,且所有单词都是由小写字母组成。
输出描述:对于每组数据,输出"Yes"或"No"
输入例子:
3
abc
cdefg
ghijkl
4
abc
cdef
fghijk
xyz
输出例子:
Yes
No

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


bool check(const vector<string> &strSet){
    for(int i=0;i<strSet.size()-1;i++){
        char frontChar = strSet[i][strSet[i].size()-1];
        char lastChar = strSet[i+1][0];
        if(frontChar!=lastChar)
            return false;
    }
    return true;
}

int main()
{
    vector<string> strSet;
    int len;
    while(cin>>len){
        for(int i=0;i<len;i++){
            string tmp;
            cin>>tmp;
            strSet.push_back(tmp);
        }
        sort(strSet.begin(),strSet.end());
        if(check(strSet)){
            cout<<"Yes"<<endl;
        }else{
            cout<<"No"<<endl;
        }
    }

    return 0;
}


题目2:页面调度算法

题目描述:在计算机中,页式虚拟存储器实现的一个难点是设计页面调度(置换)算法。其中一种实现方式是FIFO算法。
FIFO算法根据页面进入内存的时间先后选择淘汰页面,先进入内存的页面先淘汰,后进入内存的后淘汰。
假设Cache的大小为2,有5个页面请求,分别为 2 1 2 3 1,则Cache的状态转换为:(2)->(2,1)->(2,1)->(1,3)->(1,3),其中第1,2,4次缺页,总缺页次数为3。现在给出Cache的大小n和m个页面请求,请算出缺页数。

输入描述:输入包含多组测试数据。对于每组测试数据,第一行是整数n,第二行是整数m。然后有m个整数,代表请求页编号。保证:2<=n<=20,1<=m<=100,1<=页编号<=200.

输出描述:输出描述:对于每组数据,输出一个整数,代表缺页数

输入例子:

2
5
2
1
2
3
1

输出例子:

3

#include<iostream>
#include<queue>
using namespace std;

/*
现在给出Cache的大小n和m个页面请求,请算出缺页数。
*/

int FIFO(queue<int>&q,int n,int m,int &pages){
    queue<int> p(q);
    while(!p.empty()){
        int tmp=p.front();
        if(tmp==n)
            return 1;
        p.pop();
    }
    if(q.size()>=m)
        q.pop();
    q.push(n);
    pages++;
    return 0;
}
int main()
{
    int n,m;
    while(cin>>n>>m){
        queue<int> q;
        int pages=0;

        for(int i=0;i<m;i++){
            int tmp;
            cin>>tmp;
            FIFO(q,tmp,n,pages);
        }
        cout<<pages<<endl;
    }
    return 0;
}


题目3:短作业优先

题目描述:短作业优先(SJF, Shortest Job First)又称为“短进程优先”SPN(Shortest Process Next);是对FCFS算法的改进,其目标是减少平均周转时间。短作业优先调度算法基于这样一种思想:

运行时间短的优先调度;

如果运行时间相同则调度最先发起请求的进程。

PS:本题题面描述有误,但原题如此,不宜修改,实际优先级如下:
1)接到任务的时间;
2) 如果接收时间相同则调度 运行时间最短的任务。

等待时间:一个进程从发起请求到开始执行的时间间隔。
现在有n个进程请求cpu,每个进程用一个二元组表示:(p,q),p代表该进程发起请求的时间,p代表需要占用cpu的时间。请计算n个进程的平均等待时间。

输入描述:输入包含多组测试数据。对于每组测试数据,第一行为一个整数n。然后有n行,每行两个整数,代表上述的二元组(p,q).保证:2<=n<=2000,1<=p<=300,1<=q<=100.

输出描述:对于每组数据,输出一个浮点数,代表平均等待时间,请保留4位有效数字

输入例子:

4

1 4

1 3

1 5

2 1

输出例子:

5.2500

思路分析:注意理解这里的短作业优先调度算法思想,即如果运行时间相同则调度最先发起请求的进程,然后考虑运行时间短的优先调度;所以将二元组(p,q)排序保存集合中,对于两个二元组tuplea和tupleb,排序规则为如果tuplea.p<tupleb.p即为正序,如果tuplea.p==tupleb.p在比较tuplea.q和tupleb.q,如果tuplea.q<tupleb.q为正序,其他都不是。然后对排序完成的二元组集合,从前往后扫描一次每个作业的等待时间,累计求和,然后除以作业的数量,即可得到平均等待时间。下面是参考代码,欢迎交流更好的解法

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

struct job{
    int start;
    int busy;
};

bool compare(struct job job1,struct job job2){
    if(job1.start<job2.start)
        return true;
    if(job1.start==job2.start){
        if(job1.busy<job2.busy)
            return true;
        if(job1.busy==job2.busy)
            return false;
        if(job1.busy>job2.busy)
            return false;
    }
    if(job1.start>job2.start)
        return false;
}

int main()
{
    int count;
    while(cin>>count){
         vector<struct job> set;
        for(int i=0;i<count;i++){
            struct job tmp;
            cin>>tmp.start>>tmp.busy;
            set.push_back(tmp);
        }
        sort(set.begin(),set.end(),compare);
        int time=set[0].start+set[0].busy;
        int costtime=0;
        for(int i=1;i<set.size();i++){
            if(time>=set[i].start){
                costtime+=(time-set[i].start);
                time+=set[i].busy;
            }else{
                time=set[i].start+set[i].busy;  //特殊情况,这个作业的开始时间比上次作业的时间还晚
            }
        }
        cout<<costtime*1.0/set.size()<<endl;
    }
    return 0;
}



  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值