百度2017暑期实习生编程题

Posted 小河沟大河沟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了百度2017暑期实习生编程题相关的知识,希望对你有一定的参考价值。

三道题,算完了一道半,第二题,找bug很久,第三题难,参考了一下别人的。对操作系统的页面置换算法FIFO和进程的调度SJF算法了解了一下。

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


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

int main()
{
    int n;
    while (cin>>n)
    {
        vector<string> vc(n);
        for (int i = 0; i < n;i++)
        {
            cin >> vc[i];
        }
        bool flag = true;
        for (int i = 0; i < n-1;i++)   //提出为bool的函数
        {
            int size = vc[i].size();
            if (vc[i][size-1]==vc[i+1][0])
            {
                continue;
            }
            else{
                flag = false;            
                break;
            }
            
        }
        if (flag)
        {
            cout << "Yes" << endl;
        }
        else
        {
            cout << "No" << endl;
        }
    }
    return 0;
}


//页面调度算法
//在计算机中,页式虚拟存储器实现的一个难点是设计页面调度(置换)算法。其中一种实现方式是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>
using namespace std;
#include<vector>

int main()
{
    int n, m;
    while (cin>>n>>m)
    {
        int times = 0;
        vector<int> vc;  //Cache的大小n ,往里面添加m个页面请求。m>n才产生页面置换
        if (m<=n)
        {
            for (int i = 0; i < m; i++)  //m次输入
            {
                bool flag = false;
                int temp;
                cin >> temp;
                for (int j = 0; j < vc.size(); j++)
                {
                    if (vc[j] == temp)  //有相同的页面
                    {
                        flag = true;
                        break;
                    }
                }
                if (!flag)
                {
                    vc.push_back(temp);
                    times++;
                }
            }
        }
        else
        {
            for (int i = 0; i < n; i++)  //前n次输入
            {
                bool flag = false;
                int temp;
                cin >> temp;
                for (int j = 0; j < vc.size(); j++)
                {
                    if (vc[j] == temp)  //有相同的页面
                    {
                        flag = true;
                        break;
                    }
                }
                if (!flag)
                {
                    vc.push_back(temp);
                    times++;
                }
            }
            for (int i = n; i < m; i++)  //m次输入
            {
                bool flag = false;
                int temp;
                cin >> temp;
                for (int j = 0; j < n; j++)     //能否找到提出为bool的函数,find()函数返回为iterator,可以自定义函数。
                {
                    if (vc[j] == temp)  //有相同的页面
                    {
                        flag = true;
                        break;
                    }
                }
                if (!flag)
                {
                    if (vc.size()==n)  //这个bug找了很久,可能前面有重复的,根本就没有装满n个。
                    {
                        vc.erase(vc.begin());
                    }
                    vc.push_back(temp);
                    times++;
                }
            }
        }
        cout << times << endl;
    }
    return 0;
}


//优化好一些
#include <iostream>
#include <vector>

bool vecfind(std::vector<int>& vec, int num) {
    int len = vec.size();
    for (int i = 0; i < len; ++i){
        if (num == vec[i])
            return true;
    }
    return false;
}

int main() {
    int n, m;
    while (std::cin >> n >> m) {
        std::vector<int> vecCache;
        std::vector<int> vecPage(m);
        int cnt = 0;
        for (int i = 0; i < m; ++i) {
            std::cin >> vecPage[i];
        }
        for (int i = 0; i < m; ++i) {
            if (vecfind(vecCache, vecPage[i])) {
                continue;
            }
            else {
                if (vecCache.size() < n) {
                    vecCache.push_back(vecPage[i]);
                }
                else{
                    vecCache.erase(vecCache.begin());
                    vecCache.push_back(vecPage[i]);
                }
                ++cnt;
            }
        }

        std::cout << cnt << std::endl;
    }
    return 0;
}



//进程调度算法
//短作业优先(SJF, Shortest Job First)又称为“短进程优先”SPN(Shortest Process Next);是对FCFS算法的改进,其目标是减少平均周转时间。
//短作业优先调度算法基于这样一种思想:
//运行时间短的优先调度;
//如果运行时间相同则调度最先发起请求的进程。
//等待时间:一个进程从发起请求到开始执行的时间间隔。
//现在有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


//题意有错,题目中,调度的优先级:
//1)运行时间短的优先调度;
//2)如果运行时间相同则调度最先发起请求的进程。
//应当被理解为条件1优先于条件2。
//对于样例数据,在时间点1,CPU接到的任务分别为 1 3, 1 4, 1 5, 那么应该先运行1 3, 此时时间为4(不考虑抢占式调度的话), 已经接到了调度任务2 1,接下来应该运行2 1, 最后得到的结果应该是3.5.
//若要得到5.25的结果,在运行1 3 后应该运行 1 4, 随后运行 1 5, 最后 2 1,那此时优先级描述应当为:
//1)接到任务的时间;
//2) 如果接收时间相同则调度 运行时间最短的任务。


//参考:http://www.nowcoder.com/questionTerminal/6286bfa395c44b449031254d1ebd2a53
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <string>
#include <vector>
#include <queue>
#include <map>
#include <algorithm>
using namespace std;
const int maxn = 2010;

struct Node {
    int id, p, q;
    Node() { }
    Node(int _id, int _p, int _q) : id(_id), p(_p), q(_q) { }
    bool operator < (const Node &nd) const {
        if (q == nd.q) return p > nd.p;
        return q > nd.q;
    }
};
Node arr[maxn];
priority_queue<Node> pq;
bool mark[maxn];

int main() {

    //freopen("aa.in", "r", stdin);
    int n;
    double total = 0.0;
    int curt;
    int mins;
    int cnt;
    int lef;
    Node tmp;
    while (scanf("%d", &n) != EOF) {
        mins = 1010;
        for (int i = 0; i < n; ++i) {
            arr[i].id = i;
            scanf("%d %d", &arr[i].p, &arr[i].q);
            mins = min(mins, arr[i].p);
        }
        lef = n;
        cnt = 0;
        total = 0.0;
        curt = mins;
        memset(mark, false, sizeof(mark));
        while (!pq.empty()) pq.pop();
        for (int i = 0; i < n; ++i) {
            if (arr[i].p == mins) {
                lef--;
                pq.push(arr[i]);
                mark[i] = true;
            }
        }
        while (cnt < n) {
            if (!pq.empty()) {
                tmp = pq.top(); pq.pop();
                cnt++;
                total += (curt - tmp.p);
                curt += tmp.q;
            }
            else {
                curt++;
            }
            if (lef > 0) {
                for (int i = 0; i < n; ++i) {
                    if (mark[i]) continue;
                    if (curt >= arr[i].p) { pq.push(arr[i]); lef--; mark[i] = true; }
                }
            }
        }
        printf("%.4f\n", total * 1.0 / n);
    }
    return 0;
}

typedef struct pro {
    int PRO_ID;
    int arrive_time;
    int sum_time;
    int flag;
}Pro;

 

以上是关于百度2017暑期实习生编程题的主要内容,如果未能解决你的问题,请参考以下文章

腾讯2017暑期实习生编程题

腾讯2017暑期实习生编程题

腾讯2017暑期实习生编程题

腾讯2017暑期实习生编程题

腾讯2017年暑期实习生编程题有趣的数字Python

腾讯2017暑期实习生编程题 第一题 构造回文