阅文Java实习笔试
日期:2020年5月19日 19:00 时长:1.5h 平台:牛客网
题型:单选10,多选10,问答1,编程3,压轴1(编程)
总结
整体难度不算很难,但是考察的面比较广。分布式、Hadoop相关知识考察也不少。
单选题
-
不对称加密算法 DES/RSA/RC/AES 答案 RSA
对称加密:
对称算法,一个字符串可以通过某个密钥进行加密和解密。速度快效率高,但不安全,数量多时难以管理
非对称加密:
使用两个密钥,公钥、私钥,两个密钥是成对的,加密时使用公钥加密,解密时使用私钥才能完成。适用于分布式系统中的数据加密。常见的有RSA、DSA等
DES:最著名的对称加密算法,使用56位密钥对64位数据块进行16轮编码
RSA:应用广泛、历史悠久的非对称密钥加密技术
RC:对称加密,DES的建议替代算法,输入输出都是64bit
AES:对称加密算法,使用分组密码体制,将明文切成128位16个字节分组加密,最后把每段加密数据拼起来
-
程序运行时,独占系统资源,只有程序本身能改变系统资源状态,这是指
程序顺序执行的封闭性
-
二叉树结点个数计算
-
定义一个函数指针,指向的函数有两个int形参,且返回一个函数指针。返回的函数指针指向一个有一个int形参且返回int的函数
int (*(*F)(int,int))(int)
(*F) 可知F是一个指针,右边有(int,int) 即F是一个函数指针,有两个int形参
*(*F)(int,int))
可知(*F)(int,int)
是一个指针,将其看为一个整体T可得int(*T)(int)
即一个有一个int形参返回int的函数指针 -
DNS解析的是什么
域名指向IP地址
-
HDFS中block默认保存几份
3份
HDFS: Hadoop分布式文件系统。在分布式存储中,有特点:数据分块,分布式的存储在多台机器上;数据块冗余存储在多台机器以提高数据块的可用性;遵从主/从结构的分布式存储集群。
为了提高每个数据块block的高可用性,在HDFS中每个数据块默认备份存储3份。
-
HTTP协议相关,RESTful风格表达
HTTP是无状态的(每次请求都是独立的);是应用层协议
RESTful 接口中,利用 HTP 协议的 method 字段来描述要对资源操作的方式,比如 GET 表示获取资源,POST表示新增一个资源,PUT 表示更新资源, DELETE 表示删除资源等等。
-
C++中如果一个整型变量频繁使用,建议将其定义为 auto/register/extern/static
如果一个变量频繁使用,将其保存在寄存器中,寄存器的速度比内存快很多,使用register即可
auto:给变量动态分配内存,默认的分配类型
static:静态分配内存,变量在整个作用域内是全局变量
extern:声明为外部变量,在函数的外部定义变量
-
n>=0时,求时间复杂度
x=2; while(x<n/2){ x = 2*x; }
应该是log2N? 不太懂时间复杂度的计算
-
不是查看网络故障的命令
ping / telnet / init / netstat
init Linux下的进程初始化工具
多选题
-
HTTP协议 无状态的/禁用Cookies后,session仍能使用/http是
TCP/IP
的应用/response code 403 表示跳转一般情况下,在会话中,服务器存储session的sessionID是通过cookie存到浏览器中的。如果禁用了cookie,浏览器请求无法携带sessionID,服务器无法识别请求中的用户身份,session失效。但可以通过其他方式使用,如将sessionID作为参数追加到url中、通过其他header字段等;
HTTP协议是无状态的;
response code 403 表示对请求资源的访问被服务器拒绝,跳转的状态码应为3开头的,301 请求的网页已经永远移动到新位置,服务器会自动将请求者转到新位置
-
因特网可用的IP地址 10.0.0.9/127.0.0.1/202.112.0.36/61.256.256.68
10.0.0.9 是A类的私有IP地址
127.0.0.1 是本机地址
61.256.256.68 IP地址不可能为256
-
多线程同步机制
Critical Section / pipe / semaphore / Mutex
Critical Section 临界区,用来实现“排他性占有”,适用范围是单一进程的各线程之间。可以实现线程间互斥,不能用来实现同步;
Semaphore 信号量,用来追踪有限的资源,可以被其他进程开启,可以被任何一个线程释放。既能实现线程间互斥,也能实现线程间同步。
Mutex 在不同的线程之间实现“排他性站有”,即使线程分属于不同进程。可以被其他进程开启,只能被拥有的那个线程释放
Event 通常使用于 overlapped I/O,或用来设计某些自定义的同步对象。可以用来实现线程的互斥与同步,可以被其他进程开启
pipe 管道,用于具有亲缘关系的父子进程间的通信
-
Nginx功能
静态http服务器 / 虚拟主机 / 反向代理服务器 / 负载均衡
Nginx是一款高性能http服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,能够支持高并发,且资源消耗极少,运行稳定;其应用场景:
Http服务器,可以独立提供http服务,可以做网页静态服务器
虚拟主机,实现在一台服务器虚拟出多个网站
反向代理,负载均衡,使用多台服务器集群,用Nginx做反向代理
-
hive内置函数
pow / ntile / row_number / lead
Apache Hive 是建立在Hadoop架构上的数据仓库,用来进行数据提取、转化、加载。学习成本低,可通过类SQL语句快速实现简单MapReduce统计
pow(double a,double b) hive中的数值计算函数,计算a的b次幂
NTILE 将数据分片并求出其百分比
ROW_NUMBER 从1开始,按照顺序,生成分组内记录的序列。如按照pv降序排列,生成分组内每天的pv名词、获取分组内排序第一的记录、获取session中的第一条refer等
LEAD(col,n,DEFAULT) 统计窗口内往下第n行值
-
DNS解析中的顶级域
com / sina / cn / net
顶级域名 Top Level Domain
cn 国家级顶级域名 nTLD/ccTLD,cn us uk 等
com,net 通用顶级域名 gTLD com-公司企业,net-网络服务机构,org-非营利组织,int-国际组织,gov-政府部门 等
sina 二级域名/三级域名
-
1000m的环形跑道,A 1m/s,B 3m/s 多久后两者相遇
250s / 1000s / 500s / 333s
B比A快2m/s 1000m环 , 500s 一圈,1000s 两圈
-
进程间通信方式
管道 / 信号量 / 互斥锁 / Socket
进程间的7中通信方式
- 传统的Unix通信机制 管道/匿名管道 pipe
- (高级管道通信 popen)
- 有名管道 named pipe FIFO
- 信号 Signal
- 消息队列 Message queue
- 共享内存 shared memory
- 信号量 semaphore
- 套接字 socket
-
Redis支持的数据结构
hash / stack / list / set
Redis的5个基本数据结构 string list hash set zset
-
可利用分治法的场景
二分法 / 大整数乘法 / 合并排序 / 快速排序
可以使用分治法求解的经典问题:
二分搜索、大整数乘法、Strassen矩阵乘法、棋盘覆盖、合并排序、快速排序、线性时间选择、最接近点对问题、循环赛日程表、汉诺塔
问答题
编写将Map转换成JavaBean的工具类方法,实现mapToObject (利用Java反射,不使用第三方类)
public static<T> T mapToObject(Map<String,Object> map,class<T> beanClass){}
public static <T> T mapToObject(Map<String, Object> map, Class<T> beanClass) {
// 判空
if (map == null) {
return null;
}
T t = null;
try {
// 使用 newInstance 创建对象
t = beanClass.newInstance();
// 利用反射获取 Class 对象
// 可以使用 Class.forName("全类名")、类名.class、对象.getClass 三种方法
// 获取 Class 对象后,获取所有成员变量,不考虑修饰符,用 getDeclaredFields
// getFields 则是获取所有 public 修饰的成员变量
Field[] fields = t.getClass().getDeclaredFields();
// 遍历获得的成员变量
for (Field field : fields) {
// Field 的 getModifiers 方法返回一个 int 类型的值,表示该字段的修饰符
// 1 public 2 private 4 protected 8 static 16 final 1024 abstract ...
int mod = field.getModifiers();
// 跳过静态 static 和 final 的变量
if (Modifier.isStatic(mod) || Modifier.isFinal(mod)) {
continue;
}
// 开启暴力反射,忽略访问权限修饰符的安全检查 (可以访问到 private 修饰的)
field.setAccessible(true);
// Field 设置值 set(obj, value)
field.set(t, map.get(field.getName()));
}
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return t;
}
编程题
-
将给出的单链表反转 e.g. 1-2-3-4-5 => 5-4-3-2-1
-
在字符串中找到第一个不重复的字符,如果每一个都重复,抛出运行时异常,允许使用集合类 e.g. “hellohehe” -> “o”
-
计算书籍的包月到期时间离指定时间还有多少分钟,不足60s的不计入 e.g.
2020-02-01 12:00:00
2020-02-01 12:01:00
-> 1
压轴题
有N个用户其中存在朋友关系。如果A与B是朋友,B与C是朋友,ABC组成一个朋友圈。给出N个用户,计算其朋友圈数。第一行输入用户数N,第2到N+1行输入朋友间关系,1表示有关 e.g.
3
1,1,0
1,1,0
0,0,1 -> 2 (0,1)(2)
3
1,1,0
1,1,1
0,1,1 -> 1 (0,1,2)