【多益网络】笔试错题整理

前言

2021.04.09有幸参加多益网络的校招笔试,在此记录一下里面没把握的题目。


简答题

【红黑树】插入操作的时间复杂度O(logN),最坏时间复杂度O(logN)
【B+树】插入操作的时间复杂度O(1),最坏时间复杂度O(没查到- - )
【Hash表】插入操作的时间复杂度O(1),最坏时间复杂度O(N)
【排序链表】插入操作的时间复杂度O(1),最坏时间复杂度O(1)
在这里插入图片描述


多线程描述中错误的是(B
A) 共享进程数据简单,同步复杂。
B)占用内存多,切换复杂,CPU利用率低。
C)创建销毁、切换简单,速度快。
D)编程复杂、调试复杂。

多线程和多进程区别:

数据共享同步

【多进程】:数据是分开的:共享复杂,需要IPC;同步简单

【多线程】:多线程共享进程数据简单,同步复杂

内存CPU

【多进程】:占用内存多,切换复杂,CPU利用率低

【多线程】:占用内存少,切换简单,CPU利用率高

创建销毁切换:

【多进程】:复杂,速度慢。

【多线程】:简单,速度快

编程调试:

【多进程】:编程简单调试简单

【多线程】:编程复杂,调试复杂

可靠性:

【多进程】:进程间通信互不影响

【多线程】:一个线程挂掉将导致整个进程挂掉

优缺点:

多进程:

【优点】:内存隔离,单个进程的异常不会导致其他进程的奔溃,方便调试。

【缺点】:进程间的操作开销比线程大

 适合使用场合:目标的子功能之间的交互少

多线程:

【优点】:提高了系统的并行性,开销小,对cup的利用率高

【缺点】:没有内存隔离,单个线程的奔溃会导致整个应用程序的奔溃

 使用场合:存在大量的IO,网络等耗时操作。

进程状态的切换(3种状态):

运行态:指该进程正在被CPU调度运行。

就绪态:指该进程满足被cpu调度的所有条件但是并没有被调度执行。

阻塞态:指该进程正在等待某事件的发生之后才可以继续被cpu调度运行。

解释XML时,需检验结点是否闭合,如必须有与之对应,用()数据结构实现比较好?
BFS广度优先遍历用()数据结构
DFS深度优先遍历用(队列)数据结构


开放定址法处理散列表的冲突,平均查找长度与其它冲突处理方法相比,(高/低)

  • 比二分查找()【没查到- -】
  • 比链地址法(

注:
开放定址法: 一旦发生冲突,就去寻找下一个空的散列地址,只要散列地址够大,空的地址总会找到 。
链地址法: 一旦发生冲突,在当前位置给单链表增加结点就行。


将person(name,age)表中年龄在30-40之间的人在查询时优先输出。

select name,age from Person
where age between 30 and 40
union
select name,age from Person
where age <= 30 and age >= 40

关系数据库由(关系数据结构)、(关系操作集合)、(关系完整性约束)组成


有几种防御csrf的攻击方式?

有4种:

  • 使用POST替代GET
  • 检验HTTP Referer
  • 验证码
  • Token

使用POST替代GET
一些程序员在开发的时候都是用GET、POST通用的函数来接收客户端的数据,这样也是某些接口有CSRF的原因之一,但是将全部接口都改成只允许POST方式访问,就能防范CSRF了吗?答案是:不能。只能说提高了一些成本。

原本是GET方式访问的接口,攻击者只需要构造接口的URL参数让受害者点击即可。现在改成使用POST方式访问,攻击者只需要利用其他站点,在站点上布置一个POST请求,让用户点击。

检验HTTP Referer
HTTP Referer是一个用于安全的字段,除了能防范CSRF,还能防jsONP劫持、盗链、站外提交等安全问题。
但是HTTP Referer并不是完美的,HTTP Referer只能检查点击的链接来源是来自站内还是站外,如果是GET方式的CSRF,那链接本身就是站内的,也就意味着检验HTTP Referer是无效的。

验证码
上面说的两种防御CSRF的方式,都有一定缺陷。但是使用验证码是完全可以做到防止CSRF的,因为验证码是用户在提交表单的时候,必须输入图片验证码,保证了服务器收到的是来自预期的请求。

Token
Token和验证码的原理非常相似,只不过在使用上,验证码是非常需要用户交互的,但是Token基本是无感知的。

这篇文章我觉的讲的很好。
详情戳这


编程题

大数运算 A mod B

思路:用数组存储大数A,然后通过循环来计算每一位对B取模。

/*---大数运算伪代码---*/
# include <iostream>
# include <cstring>
using namespace std;

int main(){
	char A[1000]; //大数A
	int B ;
	int ans;//答案

	for(int i = 0;i < strlen(A);i++){		
		ans = (ans*10 + (int)A[i]) % B;
	}

	cout << ans << endl;
	return 0;
} 

【注】sizeof() 指整个数组大小,sizeof(A) 返回是 1000;strlen(A)代其中字符的个数,需要引用头文件<cstring>

  • 2
    点赞
  • 0
    评论
  • 8
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值