一、单选题
1、栈是先进后出的数据结构,给定一个大小为3的初始状态为空的栈,已知一组数据经过这个栈后,最终的数据顺序依次为:1 3 2 4 问原始进栈的数据不可能是以下的哪组?
A 2 3 1 4
B 3 1 2 4
C 4 2 3 1
D 1 4 3 2
答案:C,注意栈大小为3
2、下面这个c++程序运行时,描述正确的是
int a=1; const char* str=”abc”; class Obj {}; int f(int lhs, intrhs){ Obj* obj = new Obj(); Obj obj2; int aa = a; delete obj; return aa+lhs+rhs; } int main(){ int* b=new int(2); int c=f(a,*b); delete b; }
A. 保存在堆中的数据有:*b,obj2;保存在栈中的数据有:c, lhs, rhs, *obj, aa
B. 保存在堆中的数据有:*b, *obj, *str;保存在栈中的数据有:c, lhs, rhs, aa
C. 保存在堆中的数据有:*b, *obj;保存在栈中的数据有:c, lhs, rhs, obj2, aa
D. 保存在堆中的数据有:*b, *obj; 保存在栈中的数据有:str, c, lhs, rhs, obj2, aa
3、操作系统中可以使用LRU(Least Recently Used)内存淘汰旧数据的策略,如果内存需要加载新数据但空间不足,则会按照最近访问时间进行排序,并将最老的数据淘汰。假设现在内存空间大小为5,原本内存中没有数据,对内存中数据的访问顺序如下:
1, 2, 5, 3, 4, 6,1, 4, 3, 6, 7, 8, 3, 9
问访问过程中发生缺页的次数是多少次?
A. 缺页次数:4
B. 缺页次数:10
C. 缺页次数:5
D. 缺页次数:9
答案:B
4、TCP建立连接的三次握手中,第二次握手发送的包会包含的标记,最正确的描述是?
A. SYN
B. ACK
C. SYN, PSH
D. SYN, ACK
解析:
三次握手:(1)(B)->[SYN]->(A)
假设服务器A和客户机B通讯。当A要和B通信时,B首先向A发一个SYN(Synchronize)标记的包,告诉A请求建立连接。
(2)(B)<-[SYN/ACK]<-(A)
接着,A收到后会发一个对SYN包的确认包(SYN/ACK)回去,表示对第一个SYN包的确认,并继续握手操作。
(3)(B)->[ACK]->(A)
B收到SYN/ACK包,B发一个确认包(ACK),通知A连接已建立。至此,三次握手完成,一个TCP连接完成。
答案:D
科普:
四次握手用来关闭已建立的TCP连接
1. (B) -> ACK/FIN -> (A)
2. (B) <- ACK <- (A)
3. (B) <- ACK/FIN <- (A)
4. (B) ->ACK -> (A)
5、电路中其中三个门电路非门,与门,或门的示意图及性质分别如下所示:
非门,使输入的电平变成相反电平:
与门,使输入两个高电平,输出高电平,其它情况下输出低电平:
或门,当且仅当输入两个低电平时,输出低电平,否则输出高电平:
现在对以下的电路中的A和B引脚分别持续输入一个高电平(1)和一个低电平(0),问最终电路的引脚C、D、E、F分别输出的电平是什么?
A. C=1,D=1,E=1,F=0
B. C=0,D=1,E=0,F=1
C. C=0,D=0,E=0,F=1
D. C=1,D=1,E=0,F=1
答案:C
6、给定一个如下所示的图,图中的边代表了两个节点间的距离,如果使用迪杰斯特拉算法对节点1和节点8求最短路径,则当完成计算时,算得节点1到节点8的最短路径是?同时当完成节点1到节点8的最短路径计算时,节点1到哪些节点(除了1和8)的最短路径也已经计算完毕?
A. 最短路径:4;已经算得最短的节点:5
B. 最短路径:4;已经算得最短路的节点:2,3,4,5
C. 最短路径:4;已经算得最短路的节点:5,6
D. 最短路径:7;已经算得最短路的节点:3,5,6
7、有三个程序J1,J2,J3。程序在单核CPU执行时,三个程序需要的资源如下所示:
程序 |
CPU占用时间(ms) |
IO占用时间 |
执行顺序 |
优先级 |
J1 |
40 |
60 |
先CPU计算后IO |
高 |
J2 |
20 |
50 |
先IO后CPU计算 |
中 |
J3 |
30 |
20 |
先CPU计算后IO |
低 |
优先级高的程序可以抢占优先级低的程序的CPU,但不能抢占IO。问当所有任务执行完时,共消耗的时间是多少?
A. 170ms
B. 130ms
C. 160ms
D. 120ms
8、变量a是一个64位有符号的整数,初始值用16进制表示为:0x7FFFFFFFFFFFFFFF;变量b是一个64位有符号的整数,初始值用16进制表示为:0x8000000000000000,则a+b的结果用10进制表示为多少?
A.2^63+2^62+...+2^2+2^1+2^0
B. -1
C. 1
D. –(2^63+2^62+...+2^2+2^1+2^0)
9、x86 CPU在实模式下解释代码时看到一个地址为2330H:5041H,请问它最终在内存中要找的地址是多少?
A. 28341H
B. 5374H
C. 52740H
D. 7371H
10、下面的程序中,int32_t表示一个有符号的32位整数,程序的入口是main函数,问最终res的结果是多少?
int32_t f(int32_ta,int32_t b){ while(a+b>0){ a=a+1; b=b-1; } return a+b; } int32_t main(){ int32_t res=f(1,0); }
A. 0
B. -1
C. –(2^31+2^30+...+2^2+2^1+2^0)
D. 程序会死循环
二、编程题
1. 头条校招
时间限制:c/c++语言1000MS;其他语言3000MS
内存限制:c/c++语言65536KB;其他语言589824KB
题目描述:
头条的2017校招开始了!为了这次校招,我们组织了一个规模宏大的出题团队,每个出题人都出了一些有趣的题目,而我们现在想把这些题目组合成若干场考试出来,在选题之前,我们对题目进行了盲审,并定出了每道题的难度系统。一场考试包含3道开放性题目,假设他们的难度从小到大分别为a,b,c,我们希望这3道题能满足下列条件:
a<=b<=c
b-a<=10
c-b<=10
所有出题人一共出了n道开放性题目。现在我们想把这n道题分布到若干场考试中(1场或多场,每道题都必须使用且只能用一次),然而由于上述条件的限制,可能有一些考试没法凑够3道题,因此出题人就需要多出一些适当难度的题目来让每场考试都达到要求,然而我们出题已经出得很累了,你能计算出我们最少还需要再出几道题吗?
输入:
输入的第一行包含一个整数n,表示目前已经出好的题目数量。 第二行给出每道题目的难度系数d1,d2,...,dn。
输出:
输出只包括一行,即所求的答案。
样例输入:
4 20 35 23 40
样例输出
2
样例解释
在样例中,一种可行的方案是添加2个难度分别为20和50的题目,这样可以组合成两场考试:(20 20 23)和(35,40,50)。
数据范围
对于30%的数据,1<=n,di<=5;
对于100%的数据,1<=n<=10^5,1<=di<=100。
c++代码:
#include<iostream> #include<vector> #include<algorithm> using namespace std; int main(){ int n; //n 表示题目数量 while(cin>>n){ vector<int> d; //存储每道题目的难度 for(int i=0;i<n; i++){ int tmp; cin>>tmp; d.push_back(tmp); } //for //先进行排序 sort(d.begin(),d.end()); int cnt=0; //用来存储要加入的题目数量 int num=0; //存储当前连续的题目数量 int flag=-1; for(int k=0;k<n;k++){ if(flag==-1){ //说明是第一个数 num++; flag=d[k]; }else if((d[k]-flag)<=10){ //说明这个数和前一个数满足条件 num++; if(num==3){//说明此时前面三个题目已经可以组成一场考试了 num=0; flag=-1; }else{ flag=d[k]; } }else{ //说明和前一个数不满足相差小于等于10的情况 num++; cnt++; if(num==3){ num=0; flag=-1; }else{ flag+=10; } k--; } } if(num!=0){ cnt+=(3-num); } cout<<cnt<<endl; } //while return 0; }
方法二:
#include<iostream> #include<cmath> #include<vector> #include<limits.h> using namespace std; int main(){ int n; while(cin>>n){ vector<int> d; int num1 = 3-(n%3); if(num1 == 3) num1=0; int min=INT_MAX; int max = INT_MIN; for(int i=0;i<n;i++){ int tmp; cin>>tmp; if(min>tmp) min = tmp; if(max<tmp) max=tmp; d.push_back(tmp); }//for int num2 = (max - min)/10-n; if(num1>num2) cout<<num1<<endl; else cout<<num2<<endl; } return 0; }
2、异或
题目描述:
给定整数m以及n各数字A1,A2,..An,将数列A中所有元素两两异或,共能得到n(n-1)/2个结果,请求出这些结果中大于m的有多少个。
输入:
第一行包含两个整数n,m. 第二行给出n个整数A1,A2,...,An。
输出:
输出仅包括一行,即所求的答案
样例输入
3 10 6 5 10
样例输出
2
样例解释
可能的两两异或的结果有: 5 xor 6=3 5 xor 10=15 6 xor 10=12 所有异或值大于10的有两种方案。
数据范围
对于30%的数据,1<=n,m<=1000
对于100%的数据,1<=n,m,Aj<=10^5