题目链接地址:https://www.nowcoder.com/test/10780537/summary
难度系数:三颗星
1.
正确答案 3 3
首先第五行这里的效果是arr[0]变为90,但是p指针指向了arr[1]这个元素,然后关键是第六行,因为C++的参数入栈顺序是从右到左,所以第六行的效果就是先执行了右边的*(++p),所以p指针这里就已经指向了arr[2],所以答案应该为3 3.
2.
正确答案 随机数 12
这题考察的和第一题一样,因为C++的参数入栈顺序是从右到左,所以base1的构造函数在执行的时候,因为先执行的a(b),再执行的是b(i+1),所以导致a的初始化为随机数。
3.
正确答案 16 32 48
这题考察的是虚拟继承的相关知识,重点在于虚拟继承中的虚拟类指针和虚拟函数的虚拟函数表指针。
4.
正确答案 20 8 8
这题主要是搞清楚sizeof函数内的值到底是一个指针还是一个数组。
5.(编程题)
小编思路:这题算是非常简单的一题了,题意就是说找到每个小伙伴能力达到要求的最高工资的工作的工资,说的有点绕啊,不过题意应该是非常的明确,我们不需要求出是哪个工作,只需要求出最高的工资即可。首先我们将所有的工作都按照能力进行从小到大的排序,然后我们对于每个小伙伴,可以通过二分找到他能力所在的位置pos,实际上到这一步之后就是在0-pos中间找到工资最大的工作的工资,那么我们就可以直接通过一个一维数组Max,进行当前的位置的工资w和前缀的更新就好了:Max[i] = max(Max[i-1], w),此更新是O(n)的,排序是O(nlogn)的,每一个小伙伴的二分查找也是O(logn)的,前缀查询是O(1)的,那么总体复杂度算下来也非常的低。
小编AC代码:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 100000+5;
struct Node {
int d, p;
}node[maxn];
int di[maxn], Max[maxn];
int cmpD(Node a, Node b) {
if(a.d == b.d) {
return a.p < b.p;
}
return a.d < b.d;
}
int cmpP(Node a, Node b) {
return a.p < b.p;
}
int Bin_search(int x, int n) {
int L = 0, R = n-1, mid;
while(L < R) {
mid = L + ((R + 1 - L) >> 1);
if(node[mid].d < x) {
L = mid;
}
else {
R = mid - 1;
}
}
if(node[L].d < x) {
return L;
}
return -1;
}
int main() {
int n ,m;
scanf("%d%d", &n, &m);
for(int i=0; i<n; i++) {
scanf("%d%d", &node[i].d, &node[i].p);
}
sort(node, node+n, cmpD);
Max[0] = node[0].p;
for(int i=1; i<n; i++) {
Max[i] = max(Max[i-1], node[i].p);
}
for(int i=0; i<m; i++) {
scanf("%d", &di[i]);
int pos = Bin_search(di[i] + 1, n);
if(pos == -1) {
printf("%d\n", 0);
continue;
}
printf("%d\n", Max[pos]);
}
}
6.
接下来几道题就是关于计算机基础的考察题目了,首先这题的正确答案是1 3,
第一条是关于HTTP状态码的,300表示的是被请求的资源有一系列可供选择的回馈信息,301表示永久重定向,302表示暂时重定向,304表示的是get请求被允许但是文档内容并没有做出改变。其实如果玩过CTF的同学,304是经常可以看到的状态码。
第三条HTTP的header分割符是\r\n,这点不清楚的同学百度去吧。
7.
正确答案1 2 5
1234条说的是同一个问题,关于这个,有张图解释的很清楚:
5678各个协议到底是什么,不懂的同学可以百度,两种协议的关键在于区分是否是有链接的,SMTP,POP3,Telnet属于TCP协议,DNS属于UDP协议。
8.
正确答案是12345,
关于Linux的题目,对每一个命令都知道是用来做什么的就能得到答案。
9.
正确答案 A
三个指针虽然类型不同,但是指针指向的是同一个对象,那么这三个指针的取值便是相同的。
10.
正确答案 B
二叉排序树也就是我们平常说的儿茶查找树,特点就是每一个节点的左子树中的所有值都小于它,同理右子树的所有值都大于它,观察B,888后面是231,说明查找的是在888的左子树上,但是下一个值是911,大于888,故是不可能出现的。
11.
正确答案 D
进程从执行到阻塞的原因就是进程因等待某事件才能满足运行条件而无法执行,如请求临界资源,进程就会进入阻塞状态
12.
正确答案 C
13.
正确答案 A
14.
正确答案 B
15.
正确答案 D
16.
正确答案 D
银行家算法是用来避免死锁的而不是预防的。
17.
正确答案 A
这题是一道简单的动态规划的题目,不过要我们进行手算,dp[i] = dp[i-1] + dp[i-3],迅速手算即可得到答案。
18.
正确答案 A
对于卡特兰数的考察,因为电影院没有其他钞票,所以它必须用之前收来的50元进行找零,所以当前收到的50元数量必须大于收到的100元的数量,那么很明显答案是卡特兰的第十个数,当然计算是不需要计算的出来的,我们只需要计算个位即可。
19.
正确答案 C
这题搞清楚完全二叉树是什么,计算稍微仔细一点,节点数为200,那么可以算出倒数第二层的节点数为64,,最后一层的节点数位73,那么倒数第二层的叶节点数位64 - (73/2)(向上取整) = 27,则叶节点总数为27 + 73 = 100
20.
正确答案 C
其实就是算这些数里有多少个数%7 == 1,这题小编居然都算错了……
21.
正确答案 C
快排每一趟的结果会使得一个数的最终位置定下来,并且大于它的数在它的右边,小于它的数在他的左边,故选C。
22.(编程题)
这道题非常的简单,是否被3整除规律其实一眼就能看出来 0 1 1 0 1 1 0 1 1 ……
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int l, r;
scanf("%d%d", &l, &r);
int Lsum = ((l-1)/3) * 2;
if((l-1) % 3 == 2) Lsum++;
int Rsum = (r/3) * 2;
if(r%3 == 2) Rsum++;
printf("%d\n", Rsum - Lsum);
}
23.(编程题)
这题也是非常简单的一题,仔细分析,一盏灯可以照亮三个位置,那么我们从左边往右边看,当某一个位置需要被照亮的话,我们就在这个位置的下一个位置放一盏灯,这样一直更新保证不重叠,即可得到答案。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 1000+5;
char str[maxn];
int main() {
int T;
scanf("%d", &T);
while(T--) {
int n;
scanf("%d%s", &n, str);
int num = 0;
for(int i=0; i<n; i++) {
if(str[i] == '.') {
num++;
str[i] = str[i+1] = str[i+2] = 'X';
}
}
printf("%d\n", num);
}
}
24.25简答题 略
小编做这套题才花了一个小时,写个题解写了两个多小时T.T,希望大家多多支持。