百度2016暑假实习机试题(部分)

第一题、 模拟缓存

理解题意之后直接码代码就可以了。不过在保存缓存的数据结构选择上倒是有小技巧,如果你用普通数组保存,那么在加入新的页面的时候,如果数组还没满,则直接append到最末尾即可;如果缓存已满,则需淘汰第一个页面。淘汰一个旧页面时需要进行的操作是将第二个页面开始到最后一个页面往前覆盖,空出最后一个位置,然后把新页面放在最后一个位置上。这种淘汰的时间复杂度为缓存长度m。有一种改进是直接用队列queue保留缓存的长度。这里我自己使用的小技巧是用几个变量将原来的普通数组改进成一个循环数组的模式,具体代码如下。遗憾的是,使用普通数组所有测试用例全部通过,使用循环数组只能达到13/16,还欠缺考虑,如果发现,麻烦批评指正,不胜感谢。

#include <iostream>
using namespace std;

int countMissPage(int, int*, int);

int main()
{
	int page_requests[] = { 1,2,1,3,1,2 };
	int max_cache_size = 2;
	int len = 6;
	cout << countMissPage(max_cache_size, page_requests, len) << endl;
}

int countMissPage(int max_cache_size, int* page_requests, int n) {
	if (!page_requests || n <= 0)
		return 0;
	if (max_cache_size <= 0)
		return n;

	int countMiss = 0;
	int currCacheNum = 0;
	// 用来记录当前循环数组的头部
	int front = 0;
	// 缓存数组,页面编号全部初始化为0
	int* cache = new int[max_cache_size] {0};
	for (int i = 0; i < n; ++i) {
		bool isFind = false;
		// 查找请求的页面是否在当前缓存中
		for (int j = 0; j < max_cache_size; ++j)
			if (cache[j] == page_requests[i]) {
				isFind = true;
				break;
			}
		// 请求的页面不再缓存中
		if (!isFind) {
			// 未命中数加一
			countMiss++;
			// 如果缓存数组还未满,直接append在数组末尾
			if (currCacheNum < max_cache_size)
				cache[currCacheNum++] = page_requests[i];
			// 如果已满,则将原队首放入新页面,修改下一位为新队首,原队首成为队尾
			else {
				cache[front] = page_requests[i];
				front = (front + 1) % max_cache_size;
			}
		}
	}
	delete[] cache;
	return countMiss;
}

第二题、 模拟最短作业优先

分析题意可知,由于题意中规定cpu不会出现空闲的情况,也即CPU已经处理完前面的作业,下一个作业时间上还未到达。比如第二个测试用例,P4的作业时间为5明显小于P3的7,但是CPU不可能选择P4先处理而让累计cpu时间从3秒(P1和P2的累计作业时间)到9秒(P4的达到时间)中间这6秒空闲不做其他任务而只等待P4。有了这个条件,整道题就简单多了,否则需要考虑如果多个未到达作业,应该选取作业时间短的,还是时间上先到达的,抑或还有其他策略,情况变得很复杂(我就是忽略了cpu不会空闲而踏入坑里啊!),剩下的,代码中有注释:

#include <iostream>
using namespace std;

float waitingTimeSJF(int*, int*, int);

int main()
{
	int requestTime[] = { 0,2,4,5 }/*{ 0,1,3,9 }*/;
	int durations[] = { 7,4,1,4 }/*{ 2,1,7,5 }*/;
	int n = 4;
	cout << waitingTimeSJF(requestTime, durations, n) << endl;
}

float waitingTimeSJF(int* requestTime, int* durations, int n) {
	if (!requestTime || !durations || n <= 0)
		return 0.0f;
	bool* isVisited = new bool[n] {false};
	int totalTime = durations[0];
	int waitTime = 0;
	isVisited[0] = true;
	int index;
	for (int i = 1; i < n; ++i) {
		// 依题意,单个作业服务时间小于100
		int minDur = 100;
		// 对于剩下的n-1个作业,做如下循环:1)是否已经提交过;2)作业是否已经到达;3)选取所有已到达作业的最短作业
		for (int j = 0; j < n; ++j) {
			if (!isVisited[j] && requestTime[j] <= totalTime && durations[j] < minDur) {
				minDur = durations[j];
				index = j;
			}
		}
		waitTime += (totalTime - requestTime[index]);
		totalTime += durations[index];
		isVisited[index] = true;
	}
	return  (float)waitTime / (float)n;
}

第三题、 判断树2是否为树1的子树

这道题忘了截图和具体题意了,大体上跟剑指offer或者其他相关资料的题意差不多,所差“不多”的那点还挺关键:在其他书籍的子树题目中,只要树2的全部数据和结构在树1中出现过,则判定为满足条件,无论树2在树1的那个位置。但是百度这道题的话,依照我的测试,树2一定要是叶子节点与树1的叶子节点相对应才算符合条件。如下图:

情况1返回true,情况2返回false。因此一开始我使用常规的判断是否为子树只能过了case1而过不了case2,按照这个思路稍微修改一下条件之后这两个测试用例都过了,然后所有其他测试用例中过了19个中的17个,还是有一些情况没考虑周全,题意和代码都没留下来,不做测试了。

时间: 2024-11-09 11:16:48

百度2016暑假实习机试题(部分)的相关文章

京东2016暑假实习机试题(部分)

因为没有提前上测试平台,没看清楚机试要求,不知道可不可以切屏到IDE上编程,所以整晚所有编程题都是在京东的oj上做的,本来很简单的题,知道可以用那些思路但是因为不熟模板或者库函数的使用变得举步维艰,结束后自己码一下发现是很简单的. 当时只拍了一道题,为了避开色相头,拍的角度也不好,将就看吧.分析题意就知道,第一行数字为候选人的个数n,第二行数字为n个候选人目前的票数,其中小东的票数为该行的第一个数字. 做法就是,每次将小东的票数跟剩下的n-1个候选人的得票最高的那个比较,如果小东的票数低了,则从

&lt;转&gt;2016暑假实习360笔试题

编程题一: 小B最近迷上了字符串处理技术,他设计了各种处理方式,并计算字符串的属性.这次也不例外,他定义了一种新的字符置换方式.小B研究的字符串由ASCII码字母和“.”构成,这次的研究对象是“.”.他关心的对象是字符串中出现的连续两个“.”.若每次操作把其中最开始的连续两个“.”以一个“”替代,则可以将函数f(s) 定义为使得串中不出现连续两个“.”的最小置换次数. 现考虑m个字符替换操作,每次将指定位置的字符替换为给定的字符,求替换后函数f(s)的值. 输入有若干组,每组的第一行为两个整数n

&lt;转&gt;2016暑假实习中科院笔试

原文地址: http://www.cnblogs.com/jtjds/p/5339018.html 第一:首先基本上是,基于你的简历进行初步的了解. 1:询问我的github上的项目,是不是自己做的,怎么做的,问了一下那个九宫格游戏,那个是fork别人的,然后他问我自己有没有研究?,那个项目有bug,我就实话实说,然后他问我哪里有bug,如何解决bug,问题出在哪里,,霹雳啪啦,霹雳啪啦....... 2:看到我上面写考了会计证,问我是不是有从事金融的打算,学习成绩怎么样?排名如何?这个金融的问

在ISO/OSI参考模型中,网络层的主要功能是()----百度2016研发工程师笔试题(六)

在ISO/OSI参考模型中,网络层的主要功能是() 正确答案: A   你的答案: A (正确) 路由选择,拥塞控制与网络互连 提供可靠的端一端服务,透明地传送报文 数据格式变换,数据加密与解密,数据压缩与恢复 在通信实体之间传送以帧为单位的数据 添加笔记 收藏 纠错 OSI ( Open System Interconnect ),即开放式系统互联. 一般都叫 OSI 参考模型,是 ISO (国际标准化组织)组织在 1985 年研究的网络互联模型.该体系结构标准定义了网络互连的七层框架(物理层

2016年微软机试题第一题——FontSize

题目描述:N个段落 P个页面 W的段长 H的页长 一个数组给出每个段落的字数 目标找到符合要求的最大字符大小. 难点:(1)必须根据题目的描述,给出符合条件的字符输入方案: (2)使用二分法不断逼近可选择的最大字符大小: (3)如何利用判断表达式实现取整,和选择: 重要思想:最令人迷茫的地方在于,字符和段和页面之间的关系:必须要看清他们之间的层次关系:字符分割统计出段,段统计分割出现页面.利用页面的比较产生可行的结果. 1 package shounue; 2 import java.util.

2016年华为机试题--装满篮子

2 装满篮子 假设一个篮子最大载重为W,要求从多个不同重量物品中挑选出部分,使得其重量之和刚好等于W. 输入若干个正整数,其中第一个数值为篮子载重,后面若干个数值表示不同物品的重量,请判断是否存在方案能刚好装满篮子,存在装满篮子的方案输出YES,并按照输入顺序输出装满篮子的物品重量,以空格隔开:若不存在则输出NO. 备注:本题中只存在一种装满方案. 理解为背包问题: C语言代码: #include<stdio.h> void main() { int i,j,data[100],backet[

2016年华为机试题--简易消除

1 简易消除 要求:删除一组数中连续的3个及3个以上的数字,输出删除后的结果. 输入一组数字1 1 1 2 3 4 4 4 3 5 5 5 3 6 7输出2 6 7 要求:连续3个及3个以上的数字删除,输出最后的数字,若全部删除了,输出NONE C语言代码: #include<stdio.h> int judge_delete(int a[], int n); void main() { int num; int data[]={1,1,1,2,3,4,4,4,3,5,5,5,3,6,7};

百度2016实习 前端试题中的编程题2:Excel地址的相互转换 [2015南桥杯试题]

百度2016实习 前端试题中的编程题2:Excel地址的相互转换  Excel是最常用的办公软件.每个单元格都有唯一的地址表示.比如:第12行第4列表示为:"D12",第5行第255列表示为"IU5". 事实上,Excel提供了两种地址表示方法,还有一种表示法叫做RC格式地址. 第12行第4列表示为:"R12C4",第5行第255列表示为"R5C255". 要求:编写程序,对换两种不同的表示方法表示行列,即 如果输入是常规地址

百度2016研发工程师模拟笔试题

1.下面程序的输出结果是?     #include<iostream.h>    void main(){        int n[][3]={10,20,30,40,50,60};        int (*p)[3];        p=n;        cout<<p[0][0]<<","<<*(p[0]+1)<<","<<(*p)[2]<<endl;    } A.10