网易2018实习生笔试题:
1.printf以及cout都是从右向左编译,从左向右输出
2.初始化列表的的执行顺序是变量的声明顺序
3.欲实现出virtual函数,对象必须携带某些信息,主要用来在运行期决定哪一个virtual函数被调用,这份信息通常由所谓的一个vptr(virtual table pointer)指出,vptr指向一个由函数指针构成的数组vbtl(virtual table)。每一个带有virtual函数的class都有一个相应的vbtl。当对象调用某一virtual函数,实际被调用的函数取决于该对象的vptr所指的那个vbtl——编译器在其中寻找适当的函数指针。指针大小对应电脑位数,类空间大小是成员中内存最大值的最小整数倍。
4.数组名作为函数的参数退化为指针
5.关于MYSQL索引:哈希索引是memory引擎表的默认索引类型,memory也支持btree。索引将随机I/O变为顺序I/O
6.在Linux系统中,可以用来查找可执行文件的是:whereis、locate、which、type、find。
8.理解阻塞的概念:时间片用完—>执行变为就绪;I/O请求,执行变为堵塞等待事件;被调度—>就绪变为执行
11.HTTP1.0 与 HTTP1.1主要区别
长连接:
HTTP1.0需要使用keep-alive参数告知服务器要建立长连接,HTTP1.1默认支持长连接。HTTP是基于TCP/IP协议的,创建一个TCP连接需要经过三次握手,有一定的开销,如果每次通讯都要重新建立连接的话,对性能有影响。因此最好能维持一个长连接,可以用一个长连接来发送多个请求。
节约带宽:
HTTP1.1只发送header信息,不带任何body信息,如果服务器认为客户端有权限请求服务器,则返回100.否则返回401.客户端如果接受100,才开始把请求body发送到服务器。这样当服务器返回401时,客户端就可以不用发送请求body了,节约带宽。另外HTTP还支持传送内容的一部分,这样当客户端已经有一部分资源后,只需要跟服务器请求另外的部分资源即可,这是支持文件断点续传的基础。
HOST域:
现在可以web server例如tomcat,设置虚拟站点是非常常见的,web server上的多个虚拟站点可以共享同一个ip和端口。HTTP1.0没有host域,HTTP1.1支持该参数
HTTP1.1 与 HTTP 2.0主要区别
多路复用:
HTTP2.0使用了多路复用技术,同一个连接并发处理多个请求。当然HTTP1.1也可以多建立几个TCP连接,来支持并发请求,但是创建TCP连接本身有开销。TCP连接有一个预热和保护的过程,先检查数据是否传送成功,一旦成功过,再慢慢加大传输速度。因此对应瞬时并发的连接,服务器的响应会变慢。
数据压缩:
HTTP2.0使用HPACK算法对header的数据进行压缩
服务器推送:
我们对支持HTTP2.0的web server请求数据时,服务器会把一些客户端需要的资源一起推送到客户端。这种方式非常适合加载静态资源。
19.哈希算法在信息安全中的应用:
文件校验:
文件传送后的校验,将得到的目标文件计算md5 checksum与源文件的md5 checksum比对,统计两个文件的每一个码元是完全相同的。
数字签名,鉴权协议。
网易2018校招C++开发工程师笔试卷:
1.linux下查看系统内存使用情况命令:
(1)top
(2)free
(3)cat /proc/meminfo
区别命令:
(1)ps 对进程进行检测和监控,ps是显示瞬间进程的状态,并不动态连续。如果想对进程进行实时监控应该用top命令。
(2)df 用于显示磁盘分区上可用的磁盘空间
2. 什么是事物的ACID
(1)原子性(Atomic)事务中各项操作,要么全做要么全不做,任何一项的失败都会导致整个事务的失败
(2)一致性(Consistent)事务结束后系统状态是一致的
(3)隔离性(Isolated)并发执行的事务彼此无法看到对方的中间状态
(4)持久性(Durable)事务完成后所做的改动都会被持久化,通过日志和同步备份可以在故障发生后重建数据。
幻读:事务A重新执行一个查询,返回一系列符合查询条件的行,发现其中插入了被事务B提交的行
不可重复读:事务A重新读取前面读取过的数据,发现该数据已经被另一个已提交的事务B修改过了
脏读:A事务读取B事务尚未提交的数据并在此基础上操作,而B事务执行回滚,那么A读取道德数据就是咱数据
3. 复合索引:Mysql从左到右使用索引中的字段,一个查询可以只使用索引中的一部分,但只能是最左侧部分。复合索引为idx——A_B_C,所以查询条件只能是在a,ab,abc,ac才算使用到索引idx_A_B_C
2017网易游戏雷火盘古实习生招聘笔试真题
1.在一条无限长的跑道上,有N匹马在不同的位置上出发开始赛马。当开始赛马比赛后,所有的马开始以自己的速度一直匀速前进。
每匹马的速度都不一样,且全部是同样的均匀随机分布。在比赛中当某匹马追上了前面的某匹马时,被追上的马就出局。 请问按以
上的规则比赛无限长的时间后,赛道上剩余的马匹数量的数学期望是多少?
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
int n;
while (cin >> n)
{
double ans = 0;
for (int i = 1; i <= n; ++i)
{
ans += (1.0 / i);
}
cout << setiosflags(ios::fixed) << setprecision(4) << ans << endl;
}
return 0;
}
PS:全排列求期望超时,注意不是通过每种排列进行计算,而是根据每匹马能存活的概率计算。
2.头文件#include <iomanip>
主要是对cin,cout之类的一些操纵运算子,比如setfill,setw,setbase,setprecision等等。它是I/O流控制头文件,就像C里面的格式化输出一样。
▲setw(n)用法: 通俗地讲就是预设宽度 ▲setbase(int n) : 将数字转换为 n 进制
▲ setprecision用法
使用setprecision(n)可控制输出流显示浮点数的数字个数。C++默认的流输出数值有效位是6。
如果setprecision(n)与setiosflags(ios::fixed)合用,可以控制小数点右边的数字个数。
setiosflags(ios::fixed)是用定点方式表示实数,如果与setiosflags(ios::scientific)合用, 可以控制指数表示法的小数位数。
3.推箱子
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int m,n,x,y,bx,by,tarx,tary;
int st[10][10][10][10];
vector<vector<char>> store;
bool valid(int x, int y)
{
if (x >= 0 && x < m&&y >= 0 && y < n&&'#' != store[x][y])
{
return true;
}
return false;
}
int main()
{
cin >> m >> n;
store = vector<vector<char>>(m, vector<char>(n,' '));
for (int i = 0; i < m; ++i)
{
for (int j = 0; j < n; ++j)
{
char temp;
cin >> temp;
if ('X' == temp)
{
x = i;
y = j;
//cout <<x<<" "<<y<<endl;
}
if ('*' == temp)
{
bx = i;
by = j;
}
if ('@' == temp)
{
tarx = i;
tary = j;
}
store[i][j] = temp;
}
}
//输入完成
vector<vector<int>> move = { {1,0},{-1,0},{0,1},{0,-1} };
queue<vector<int>> que;
st[x][y][bx][by] = 1;
que.push({x,y,bx,by});
while (false == que.empty())
{
vector<int> temp = que.front();
que.pop();
int x = temp[0], y = temp[1], bx = temp[2], by = temp[3];
for (int i = 0; i < 4; ++i)
{
int nx = x + move[i][0], ny = y + move[i][1];
int nnx = nx + move[i][0], nny = ny + move[i][1];
if (valid(nx, ny) && (bx != nx || by != ny) && 0 == st[nx][ny][bx][by])
{
que.push({nx,ny,bx,by});
st[nx][ny][bx][by] = st[x][y][bx][by] + 1;
continue;
}
else if ((bx == nx && by == ny) && valid(nnx, nny) && 0 == st[nx][ny][nnx][nny])
{
if (tarx == nnx && tary == nny)
{
cout << st[x][y][bx][by] << endl;
return 0;
}
else
{
st[nx][ny][nnx][nny] = st[x][y][bx][by] + 1;
que.push({ nx,ny,nnx,nny });
}
}
}
}
cout << -1 << endl;
return 0;
}
爱奇艺2018秋季校招C++工程师(第二场)
1.有一个算法的递推关系式为:T(n) = 9 T(n / 3) + n,则该算法的时间复杂度为()(^符号是幂的意思)
牛客网:
1.类数组有多少个元素,就有多少个类对象,就会调用相应次数的类构造函数。指向类的指针数组,存放了对应元素个数的类对象的指针,不指向任何对象,也不调用构造函数。
2.*p++和*(p++)都是将p进行解引用后,在自增。
3.公有继承中,基类公有成员在派生类是公有,基类保护成员在派生类是保护,那么一个保护的成员在类的对象中可以访问吗?自然是不能的呀,只有public成员才能类外被访问,这里的类外包括类的对象。