2017百度实习生笔试编程题

来源:互联网 发布:javascript 跳转页面 编辑:程序博客网 时间:2024/05/16 00:54

Question1

度度熊想去商场买一顶帽子,商场里有N顶帽子,有些帽子的价格可能相同。度度熊想买一顶价格第三便宜的帽子,问第三便宜的帽子价格是多少?

用hash表,剔除价格一样的帽子,然后,用优先队列(大顶堆)求出第三大

#include<iostream>#include<queue>#include<unordered_map>using namespace std;int main(){    int n;    while(cin>>n){        priority_queue<int> q;        unordered_map<int,int> hash;        for(int i=0;i<n;i++){            int tmp;            cin>>tmp;            if(hash[tmp]==0){                hash[tmp]++;                q.push(tmp);                if(q.size() > 3)                    q.pop();            }        }        if(q.size()>=3)            cout<<q.top()<<endl;        else            cout<<-1<<endl;    }    return 0;}

Question2

一个数轴上共有N个点,第一个点的坐标是度度熊现在位置,第N-1个点是度度熊的家。现在他需要依次的从0号坐标走到N-1号坐标。
但是除了0号坐标和N-1号坐标,他可以在其余的N-2个坐标中选出一个点,并直接将这个点忽略掉,问度度熊回家至少走多少距离?

重点是依次,每个点是一个坐标。
暴力,遍历每个忽略的点

#include<iostream>#include<vector>#include<algorithm>using namespace std;int main(){    int n;    while(cin>>n){        vector<int> vec(n);        int minDis=65524;        int index=0;        for(int i=0;i<n;i++){            cin>>vec[i];        }        for(int k=1;k<n-1;k++){            int curDis=0;            int last=vec[0];            for(int i=1;i<n;i++){                if(i!=k){                    curDis+=abs(vec[i]-last);                     last=vec[i];                }                else                    last=vec[i-1];            }            minDis=min(curDis,minDis);        }        cout<<minDis<<endl;    }    return 0;}

Question3

三维空间中有N个点,每个点可能是三种颜色的其中之一,三种颜色分别是红绿蓝,分别用’R’, ‘G’, ‘B’表示。
现在要找出三个点,并组成一个三角形,使得这个三角形的面积最大。
但是三角形必须满足:三个点的颜色要么全部相同,要么全部不同。

把问题拆分成一个一个小问题,用结构体存储这些信息
1、三个点的颜色要么全部相同,要么全部不同
2、组成三角形(两边之和大于第三边)
3、能否组成三角形(百度公式)

#include<iostream>#include<vector>#include <iomanip>#include<algorithm>using namespace std;typedef struct Point{    char c;    int x;    int y;    int z;};double isValid(Point p1,Point p2,Point p3){    bool flag = false;    if(p1.c==p2.c && p2.c==p3.c && p1.c==p3.c)        flag = true;    else if(p1.c!=p2.c && p2.c!=p3.c && p1.c!=p3.c)        flag = true;    if(flag == false)        return -1;    double l1=(double)(p1.x-p2.x)*(p1.x-p2.x)+(double)(p1.y-p2.y)*(p1.y-p2.y)+(double)(p1.z-p2.z)*(p1.z-p2.z);    double l2=(double)(p3.x-p2.x)*(p3.x-p2.x)+(double)(p3.y-p2.y)*(p3.y-p2.y)+(double)(p3.z-p2.z)*(p3.z-p2.z);    double l3=(double)(p1.x-p3.x)*(p1.x-p3.x)+(double)(p1.y-p3.y)*(p1.y-p3.y)+(double)(p1.z-p3.z)*(p1.z-p3.z);    l1=sqrt(l1);    l2=sqrt(l2);    l3=sqrt(l3);    if(l1+l2 < l3)        flag = false;    else if(l1+l3 < l2)        flag =false;    else if(l2+l3 < l1)        flag = false;    else        flag = true;    if(flag == false)        return -1;    double p,area;     p = (l1+l2+l3)/2;     area = sqrt(p*(p-l1)*(p-l2)*(p-l3));    return area;}int main(){    int n;    while(cin>>n){        vector<Point> vec(n);        double maxArea=0;        for(int i=0;i<n;i++){            cin>>vec[i].c>>vec[i].x>>vec[i].y>>vec[i].z;        }        for(int i=0;i<n;i++)            for(int j=i+1;j<n;j++)                for(int k=j+1;k<n;k++){                    double tmp=isValid(vec[i],vec[j],vec[k]);                    if(tmp > 0.0)                        maxArea=max(maxArea,tmp);                }        printf("%.5f", maxArea);    }    return 0;}

Question4

度度熊有一个N个数的数组,他想将数组从大到小排好序,但是萌萌的度度熊只会下面这个操作:
任取数组中的一个数然后将它放置在数组的最后一个位置。
问最少操作多少次可以使得数组从小到大有序?

map存值和下标的关系,排序后,比较相邻的元素,看是否需要移动

#include<iostream>#include<vector>#include<algorithm>#include<unordered_map>using namespace std;int main(){    int n;    while(cin>>n){        vector<int> vec(n);        unordered_map<int,int> hash;        for(int i=0;i<n;i++){            cin>>vec[i];            hash[vec[i]]=i;        }        sort(vec.begin(),vec.end());        int pos=n,count=0;        for(int i=0;i<n-1;i++){            if(hash[vec[i]] > hash[vec[i+1]]){                hash[vec[i+1]]=pos;                pos++;                count++;            }        }        cout<<count<<endl;    }    return 0;}

Question5

度度熊最近对全排列特别感兴趣,对于1到n的一个排列,度度熊发现可以在中间根据大小关系插入合适的大于和小于符号(即 ‘>’ 和 ‘<’ )使其成为一个合法的不等式数列。但是现在度度熊手中只有k个小于符号即(‘<”)和n-k-1个大于符号(即’>’),度度熊想知道对于1至n任意的排列中有多少个排列可以使用这些符号使其为合法的不等式数列。

还没做,求大神解答。。。

0 0
原创粉丝点击