2017百度實習生招聘編程題

題目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;
}



  

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