网易互联网部门2016年校园招聘笔试

原文写于2015/10/09

刚刚做完网易的题,手上还是火辣辣的。

题型分三种,选择题20*2,问答题3*10,编程题2*30。选择题不多说,主要考核内容是TCP/IP基础,linux基本操作,线程管理知识,数据结构和c语言基础。我个大水逼网络相关的基本靠蒙,估计20题能做对12题就谢天谢地了。

下面重点说一下问答题和编程题。问答题共三题,其中一题是问路由器在OSI模型和TCP/IP模型当中的位置,以及路由器的工作原理和相关协议。这个不赘述。

问答题的另外两个小题,和编程题的两个小题,是我今天博文的重点。


1.写一个类。该类只能创建唯一对象。

第一感觉,本题应该涉及到类的复制控制或是引用计数。但是,说实话,这题我是真不会。考试结束后找了一下相关的内容。

参考:http://www.cnblogs.com/this-543273659/archive/2011/08/02/2125487.html


2.已知给定数组A[1],A[2],...,A[n],要求在O(n)时间内创建新数组B[1],B[2],...,B[n],使得B[i] = A[1]*A[2]*...*A[n]/A[i],要求不能使用除法。

本题的难点在于:1)时间复杂度O(n). 2)不能使用除法。

左思右想,没想到答案。考试结束后继续找相关的内容。

参考:http://www.aliog.com/41961.html


3.编程题

注:在赛码上笔试的所有编程题,输入数据的量都是未知的,最好使用getline()来获取测试用例的输入,以便于判断输入的结束。

/***************************************************************************************************************************/

小易的升级之路
Problem Description:
小易经常沉迷于网络游戏。有一次,他在玩一个打怪升级的游戏,他的角色的初始能力值为a。在接下来的一段时间内,他将会依次遇见n个怪物,每个怪物的防御力为b1,b2,b3,…bn。如果遇到的怪物防御力bi小于等于小易的当前能力值c,那么他就能轻松打败怪物,并且使得自己的能力值增加bi;如果bi大于c,那他也能打败怪物,但他的能力值只能增加bi与c的最大公约数。那么问题来了,在一系列的锻炼后,小易的最终能力值为多少?
输入
对于每组数据,第一行是两个整数n(1<=n<=100000)表示怪物的数量和a表示小易的初始能力值,第二行n个整数,b1,b2..bn.(1<=bi<=n)表示每个怪物的防御力
数据保证——
50%的n<=100,
80%的n<=1000,
90%的n<=10000,
100%的n<=100000.
输出
对于每组数据,输出一行。每行仅包含一个整数,表示小易的最终能力值。

样例输入
3 50
50 105 200
5 20
30 20 15 40 100
样例输出
110
205

/***************************************************************************************************************************/

本题的注意点:

1)最大公约数的计算。我的方法比较笨,先对两个数做质因数分解,再分别计算所有的公共质因数之积。

2)数据规模。因最终能力值的最大可能为n*n,可达到10^10,所以使用int不足以表示该数据的规模,建议使用long long或字符串。

代码如下

#include"cstdio"
#include"iostream"

#include
#include
#include
#include
#include
#include

using namespace std;

#define debug
/*********************************************************************/

void get_number(string &input, int &m, int &n)  
{  
    string::size_type pos = input.find(' ');  
    string sm(input.begin(), input.begin()+pos);  
    string sn(input.begin()+pos+1, input.end());  
  
    m = std::atoi(sm.c_str());  
    n = std::atoi(sn.c_str());  
} 

int max_yue(int m, int n)
{
	vector m_list, n_list;

	int mt = std::sqrt((double)m)+1;
	m_list.push_back(1);
	for(int i=2;i<=mt;i++){
		while(m%i == 0){
			m_list.push_back(i);
			m = m / i;
		}
		if(m==1)
			break;
	}
	if(m!=1)
		m_list.push_back(m);


	int nt = std::sqrt((double)n)+1;
	n_list.push_back(1);
	for(int i=2;i<=nt;i++){
		while(n%i == 0){
			n_list.push_back(i);
			n = n / i;
		}
		if(n==1)
			break;
	}
	if(n!=1)
		n_list.push_back(n);

	int result = 1;
	for(unsigned int i=0;i::iterator iter = find(n_list.begin(), n_list.end(), m_list[i]);
		if(iter!= n_list.end()){
			result = result * m_list[i];
			n_list.erase(iter);
		}
	}

	return result;
}

/*********************************************************************/
int main(void)
{
#ifdef debug
	freopen("input.txt","r", stdin);
#endif
/*********************************************************************/

	int a,b;
	int temp, yue;
	long long total;
	string input;

	std::getline(cin, input);
	string::size_type pos;

	while(input.size()!=0){
		get_number(input, b, a);
		total = a;

		for(int i=0;i>temp;
			if(temp<= total)
				total+= temp;
			else{
				yue = max_yue(temp, total);
				total += yue;
			}
		}
		cout<

4.编程题

/***************************************************************************************************************************/

约德尔测试
Problem Description:
兰博和提莫闲聊之后,回归到了他们的正题,约德尔人的未来。
说起约德尔人的未来,黑默丁格曾经提出了一个约德尔测试,将约德尔人的历史的每个阶段都用一个字符表达出来。(包括可写字符,不包括空格。)。然后将这个字符串转化为一个01串。转化规则是如果这个字符如果是字母或者数字,这个字符变为1,其它变为0。然后将这个01串和黑默丁格观测星空得到的01串做比较,得到一个相似率。相似率越高,则约德尔的未来越光明。
请问:相似率为多少?
输入
每组输入数据为两行,第一行为有关约德尔人历史的字符串,第二行是黑默丁格观测星空得到的字符串。
(两个字符串的长度相等,字符串长度不小于1且不超过1000。)
输出
输出一行,在这一行输出相似率。用百分数表示。(相似率为相同字符的个数/总个数,精确到百分号小数点后两位。printf("%%");输出一个%。)

样例输入
@!%12dgsa
010111100
样例输出
66.67%

/***************************************************************************************************************************/

本题的核心即是字符串中每个字符类型的判断。基本没有难点。

代码如下:

#include"cstdio"
#include"iostream"

#include
#include
#include
#include
#include
#include

using namespace std;

#define debug
/*********************************************************************/

bool is_alpha(char c){
	if((c<='9'&&c>='0') || (c>='a'&&c<='z') || (c>='A'&& c<='Z'))
		return true;
	else
		return false;
}

/*********************************************************************/
int main(void)
{
#ifdef debug
	freopen("input.txt","r", stdin);
#endif
/*********************************************************************/

	string input, input2;

	std::getline(cin, input);
	while(input.size() != 0 ){
		int count=0;
		getline(cin, input2);
		for(unsigned i =0;i


你可能感兴趣的:(网易互联网部门2016年校园招聘笔试)