58同城 | C/C++工程师笔试题详解
Posted 学益得智能硬件
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了58同城 | C/C++工程师笔试题详解相关的知识,希望对你有一定的参考价值。
作者 | Lee
试题来自牛客网。
一
F,E,D,C,B,A的顺序进栈,请问下列哪一个出栈顺序是不可能的是()
A、EDCFAB
B、DCABEF
C、EDCFBA
D、CBDFEA
答案:D
题解:
选项D:FEDC进栈,C出栈,此时栈顶是D;B进栈,B出栈,此时栈顶是D;D出栈,此时栈顶是E;F在E的下面,所以F不可能出栈。D选项错误。
二
一个单向链表上的两个元素,指针M和N分别指向这两个元素,M所指元素是N所指元素前驱的条件是()
A、M->next = N;
B、M->next = N->next;
C、N->next = M;
D、M = N;
答案:A
三
现有长度分别为1,2,3,4,5,6,7,8,9,10 的木棍各一根,现要求用这些木棍(可以多根组合,但组合A=B=C=D, ABCD、ACDB..等重排列算一种正方形)拼成一个正方形,可以有几种拼法()
A、18种
B、19种
C、20种
D、15种
答案:B
题解:
边长7有一种:1+6、2+5、3+4、7;
边长8有一种:1+7、2+6、3+5、8;
边长9有五种:1+8、2+7、3+6、4+5、9;(选4组进行组合)
边长10有五种:1+9、2+8、3+7、4+6、10;(选4组进行组合)
边长11有五种:1+10、2+9、3+8、4+7、5+6;(同上)
边长12有一种:2+10、3+9、4+8、5+7;
边长13有一种:3+10、4+9、5+8、6+7;
一共 19 种。
四
A、fe80:0:b4f9:6c6f:b658:d4aa
B、fe80:0:0:0:b4u9:6c6f:b658:d4aa
C、fe80::b4f9:6c6f:b658:d4aa
D、fe80::b4f9:6c6f:b658::d4aa
答案:C
题解:
1050:0000:0000:0000:0005:0600:300c:326b
可以写成:
1050:0:0:0:5:600:300c:326b
IPv6 可以通过双冒号代替一系列的0,比如:
ff06:0:0:0:0:0:0:c3
可以写成:
ff06::c3
五
1+2*(3+8/4)的后缀表达式正确写法是()
A、12384/+*+
B、/+*+12384
C、12384+*+/
D、+*+/12384
答案:A
题解:
中缀表达式变成后缀表达式的规则:
遇到数字直接写出来;
遇到运算符:
如果栈为空,直接进栈;
如果优先级高于栈顶元素,直接进栈;
如果是(直接进栈;
如果是),则栈顶出栈,直到遇到(;
如果优先级不高于栈顶, 则栈顶出栈;
如果栈顶是(,直接进栈。
六
运维同学通知我们一台服务器(linux)存放日志的磁盘分区快满了,因此我们决定删除一些日志。但该服务器部署了多个服务,我们想优先删除磁盘占用量比较大的服务的日志。已知所有服务都将日志打印到/opt/scf/log/{服务名}/{服务名}.log, 请帮忙选出一个命令来查看各个服务日志占用的空间()
A、df -h /opt/scf/log
B、df -h /opt/scf/log/*
C、du -sh /opt/scf/log
D、du -sh /opt/scf/log/*
答案:D
题解:
df -h:以可读性较好的方式显示文件系统信息;
du -sh:查看当前目录下各个文件及目录占用空间大小
七
以下哪项是对单核cpu执行程序时间的正确描述()
A、程序CPU执行时间= 指令数× 时钟周期时间
B、程序CPU执行时间= CPU时钟周期数× 单条指令平均执行周期
C、程序CPU执行时间=指令数×单条指令平均执行周期×时钟周期时间
D、程序CPU执行时间= CPU时钟周期数× 指令数×单条指令平均执行周期×时钟周期时间
答案:C
八
机器间传输数据,发送端发送2096字节的数据,接收端会出现丢失部分数据情况(传输协议使用: UDP),引起这问题最大可能原因()
A、网络环境问题
B、接收端网卡问题
C、数据长度大于接收端缓冲区
D、网络传输分包
答案:C
九
采用快排对3 7 6 9 10 12 1进行排序(第一个为基准数),第一轮探测结果为()
A、1 3 6 9 10 12 7
B、9 1 6 3 10 12 7
C、3 1 6 9 10 12 7
D、1 3 6 7 9 10 12
十
以下关于进程调度算法的描述中,错误的是()
A、优先级调度算法会引起进程的饥饿问题
B、短作业优先调度算法的平均等待时间最少
C、当系统最长响应时间一定时,时间片轮转调度算法的时间片大小与系统允许的最大进程数成正比
D、高响应比优先调度算法综合考虑了进程等待时间和执行时间
十一
对TCP/IP协议集叙述正确的的选项()
A、TCP/IP协议集分为4层,从上到下依次分别为应用层、网络层、传输层、接口层
C、网络层包含有"TCP"、"UDP"等
D、"TCP"在创建链接使用"3次握手",断开链接使用"4次握手"
题解:
选项A:应用层-传输层-网络层-数据链路层;
选项B:ARP属于网络层;
选项C:TCP和UDP协议属于传输层。
十二
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32M,其他语言64M
给定一个字符串,字符串是有序的整数集合,逗号相连,移除相同的数字,使每个数字只出现一次,输出最终的数字个数。
输入描述:
1,2,2
输出描述:
2
输入例子1:
1,2,2
输出例子1:
2
输入例子2:
0,0,1,1,1,2,2,3,3,4
输出例子2:
5
int count(int *a, int last)
{
int i, length = 1, num = a[0];
for (i = 1; i <= last; i++)
{
if (a[i] != num) //遇到相同的数字跳过,统计不同数字的个数
{
length++;
num = a[i];
}
}
return length; //返回个数
}
int str_to_int(char *str, int *a)
{
int i = 0;
char *p1, *p2;
p1 = str;
p2 = str;
char num[32] = {0};
while (*p1 != '\0' && *p2 != '\0')
{
if (*p2 == ',') //遇到逗号开始解析前面的字符串
{
strncpy(num, p1, p2 - p1); //存放逗号之间的字符串
a[i++] = atoi(num); //字符串转换成数字
p1 = ++p2;
memset(num, 0, sizeof(num));
}
else
{
p2++;
}
}
strncpy(num, p1, p2 - p1); //最后一个数字没有逗号,单独处理
a[i] = atoi(num);
return i; //返回最后一个数字的下标
}
int main()
{
char str[1024] = {0};
int array[1024] = {0};
scanf("%s", str); //把输入当做一个字符串获取
int length = str_to_int(str, array); //根据逗号解析字符串,得到一个整形数组
printf("%d\n", count(array, length));
return 0;
}
十三
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32M,其他语言64M
现有一个地图,由横线与竖线组成(参考围棋棋盘),且两点之间有行走距离起点为左上角,终点为右下角在地图上,每次行走只能沿线移动到临近的点,并累加路径计算一个人从地图的起点走到终点的最小路径为多少。
输入描述:
m*n地图表示如下:
3
3
1 3 4
2 1 2
4 3 1
其中m=3,n=3 表示3*3的矩阵
行走路径为:下>右>右>下
输出描述:
路径总长:1+2+1+2+1=7
输入例子1:
1
2
1 2
输出例子1:
3
输入例子2:
2
3
9 8 6
2 3 7
输出例子2:
21
int min(int x, int y)
{
return (x < y) ? x : y;
}
int main()
{
int m, n;
int i, j;
scanf("%d%d", &m, &n);
//int (*input)[n] = (int (*)[n])malloc(sizeof(int) * m * n);
int **input = (int **)malloc(sizeof(int *) * m);
for (i = 0; i < m; i++)
{
input[i] = (int *)malloc(sizeof(int) * n);
}
for (i = 0; i < m; i++)
{
for (j = 0; j < n; j++)
{
scanf("%d", &input[i][j]);
}
}
//int (*dp)[n] = (int (*)[n])malloc(sizeof(int) * m * n);
int **dp = (int **)malloc(sizeof(int *) * m);
for (i = 0; i < m; i++)
{
dp[i] = (int *)malloc(sizeof(int) * n);
}
dp[0][0] = input[0][0];
for(i = 1; i < m; i++)
{
dp[i][0] = dp[i - 1][0] + input[i][0];
}
for(i = 1; i < n; i++)
{
dp[0][i] = dp[0][i - 1] + input[0][i];
}
for(i = 1; i < m; i++)
{
for(j = 1; j < n; j++)
{
dp[i][j] = min(dp[i-1][j], dp[i][j - 1]) + input[i][j];
}
}
printf("%d\n", dp[m - 1][n - 1]);
return 0;
}
★ 系 列 课 推 荐 ★
以上是关于58同城 | C/C++工程师笔试题详解的主要内容,如果未能解决你的问题,请参考以下文章