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任意的排列中有多少个排列可以使用这些符号使其为合法的不等式数列。
还没做,求大神解答。。。
- 2017百度实习生笔试编程题
- 2017百度实习生招聘笔试真题编程题集合
- 百度实习生笔试题
- 2012百度实习生笔试题
- 百度2012实习生笔试题
- 乐视2017暑期实习生笔试编程题
- 2017腾讯实习生招聘笔试编程题
- 2017滴滴实习生笔试编程题
- 百度2017暑期实习生编程题
- 2017百度实习生招聘编程题
- 百度2017暑期实习生编程题
- 百度2017暑期实习生编程题
- 百度2017暑期实习生编程题
- 2017百度实习生招聘编程题
- 百度2017春招实习生编程题
- 百度2017春招实习生编程题
- 2017百度实习生春招java笔试题 不等式数列
- 百度实习生网上笔试题之一
- Android 技术重温系列 ( 4 )
- ORA-01461: can bind a LONG value only for insert into a LONG column
- 人物列表
- 轻量级分布式 RPC 框架
- timer+timertask 制作定时器
- 2017百度实习生笔试编程题
- springboot属性配置
- Android 技术重温系列 ( 5 )
- struts1配置文件中action的常用属性
- 转载:最值得反思:迟到太久不必到
- 瑞神要考研(并查集)
- 新建项目直接修改UTF-8格式
- 【并查集】nyoj711
- 并查集