shopee 3.17笔试复盘|项目复盘

610 阅读10分钟

一,简介

shopee笔试共两个小时,分为15道选择题和3道编程题,在选择题的广度上,比较广博(虽然分值一般),第一道题甚至是C语言存储变量的题。三道编程题在难度上一般,主要是输入输出的琐碎,不过看群里其他同学被输入输出绊住了,讲道理如果是因为题难,你写不出来大家都写不出来,这样平均水平低,别人还可以捞你,但是要是只是因为输入输出不够熟练,而被淘汰,那可太遗憾了。

过程

选择题

选择题涵盖范围很多,一一介绍,不过原题总是记得不大清晰,所以就按照知识点说了

程序的机器级表示(不是)

struct table{
    int s1,
    int s2,
    char s3,
    char s4,
    int s5,
    char s6,
    char s7
};

table占了多少个字节 这道题有3个int变量和4个char变量,而由于int变量占四个字节,char变量占一个字节,因此结构体table占 3 * 4 + 4 * 1 = 16个字节

补充:

变量类型大小
char1
int4
float4
double8
short2
long4
long long8

字符串求子串

s.substr(pos,len);
// 从pos位开始,len个长度,
//这个看起来很简单,原题如下

设字符串S1=″ABCDEFG″,S2=″PQRST″,则运算S=CONCAT(SUBSTR(S1,2,LENGTH(S2)),SUBSTR(S1,LENGTH(S2),2))后S的结果为() 其实挺简单的题,一看三个参数就有点不知所措

跨站请求伪造CSRF与跨站脚本攻击XSS

从这里就开始不当人了,明明我面的是后端,非要出点我没见过的难为下我

CSRF 其原理是攻击者构造网站后台某个功能接口的请求地址,诱导用户去点击或者用特殊方法让该请求地址自动加载。用户在登录状态下这个请求被服务端接收后会被误以为是用户合法的操作。对于 GET 形式的接口地址可轻易被攻击,对于 POST 形式的接口地址也不是百分百安全,攻击者可诱导用户进入带 Form 表单可用POST方式提交参数的页面。

说白了,就是整个小网址(后端暴露出来的接口),让你点进去就上当

那么怎么解决呢

最简单的方法是让后端服务器在收到前端页面请求时,生成一个随机数,并将其填入至form当中。同时服务端设置setCookie,把该随机数作为cookie或者session种入用户浏览器。在用户提交表单时,通过比较随机数,如果一致则可以使用功能。

XSS 恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。”

这样可以做的事情就很多了,比如窃取cookie值,比如上面说的CSRF

那么怎么解决呢

  1. Http-Only保证同一cookie不能被滥用
  2. 过滤掉script标签

sql数据库

问题:下列哪个聚合函数不忽略空值,count(),avg(),sum(),max(),min() 答案:cout()

计算机网络 —— ICMP协议

网络层使用ICMP来让主机或路由器报告差错和异常情况。ICMP报文作为IP层数据报的数据,加上数据报的首部,组成IP数据报发送出去

ICMP是IP层协议【网络层协议】

  • iCMP报文分为 ICMP差错报告报文 和 ICMP询问报文

ICMP差错报告报文用于目标主机或到目标主机路径上的路由器向源主机报告差错和异常情况

  • 终点不可达:当路由器或主机不能交付数据报时,就向源点发送终点不可达报文
  • 源点抑制:当路由器或主机由于过于拥塞而丢弃数据报时,就向源点发送源点抑制报文,使源点知道慢点发
  • 时间超过:当路由器收到TTL为0的报文时,当终点在预先规定的时间内不能收到一个数据包的全部数据报片时,丢弃数据报,并向源点发送时间超过报文
  • 参数问题:当路由器或目的主机收到的数据报的首部中有的字段的值不正确时,就丢弃该数据报,并向源点发送参数问题报文。
  • 改变路由(重定向):路由器把改变路由报文发送给主机,让主机知道下次应将数据报发给另外的路由器

不应发送ICMP差错报告报文的情况

  • 对ICMP差错报告报文【不套娃】
  • 对第一个分片以外的后续数据报片
  • 对具有组播地址的数据报
  • 对具有特殊地址的(127 0.0.0.0)

ICMP询问报文:回送请求和回答报文,时间戳请求和回答报文、掩码地址请求和回答报文、路由器询问和通告报文

IP层其他协议

地址解析协议ARP

IP地址到MAC地址的映射

  • 每个主机都维持一个ARP高速缓存表【动态】

工作原理<同一局域网内>

  • 先在表中查询有无主机B的IP地址
  • 若无 使用目的MAC地址为FF-FF-FF-FF-FF-FF的帧来封装并广播ARP请求分组,
  • 主机B收到请求后,向A发出响应ARP分组:主机B的IP与MAC地址的映射关系

<不同局域网>

  • 通过ARP找到一个位于本局域网上某个路由器的硬件地址

动态主机配置协议DHCP

给主机动态分配IP地址

这种机制允许一台计算机加入新的网络和获取IP地址而不用手工参与

  • DHCP是应用层协议,他是基于UDP的

工作原理

  • 使用客户/服务器模式

  • 需要IP地址的主机在启动时就向DHCP服务器广播<因为它不知道DHCP的地址>发送发现报文

  • DHCP服务器先在其数据库里查找该计算机的配置信息,如果找到,就返回找到的信息,若找不到则从IP地址池中取一个地址分配[广播]给该计算机,回答的报文称为提供报文

  • 三次握手

  • 多个DHCP服务器发送消息,客户机只挑最快的那个

  • 分配的IP地址是临时的,时间由服务起决定

设计模式不考,考设计模式主题

系统复用与系统扩展(个人对设计模式的理解还是面向对象的那套,面向对象也就是封装复用多态)

TCP四次挥手

都在图里了,应该不用解释

为什么TCP挥手四次,握手三次?

建立连接的时候, 服务器在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。 而关闭连接时,服务器收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,而自己也未必全部数据都发送给对方了,所以己方可以立即关闭,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送,从而导致多了一次。

为什么要等待2MSL 服务器并不知道客户端是否接到自己的ACK 1:如果没接到,那客户端就会以为服务器没收到,就会重发一个,这个时候的最大时间,就是2MSL 2:如果接到,客户端不需要确认,直接关闭连接。

作业调度算法

  • 先来先服务FCFS调度算法
    • 对长作业有利对短作业不利(相对于SJF和高响应比)
    • 适用于CPU繁忙型,不适用于IO繁忙型
  • 短作业优先SJF调度算法
    • 长作业不利【饥饿】
    • 该算法完全未考虑作业的紧迫程度
    • SJF算法的平均等待时间,平均周转时间最少
  • 优先级调度算法

image-20201031222415942.png

  • 高响应比优先调度算法
    • 先来先服务和短作业优先的综合 image-20201031223023406.png

image-20201031223054530.png

  • 时间片轮转调度
  • 多级反馈队列调度算法
    • 为提高系统吞吐量和缩短平均周转时间而照顾短进程
    • 为获得IO设备利用率和缩短响应时间而照顾IO型进程
    • 设置多个就绪队列,优先级逐次降低
    • 优先级越高时间片越小
    • 如果一个时间片未完成,放入下一个队列
    • 一个队列为空才会运行下一个队列

image-20201101014954079.png

带头节点指针的单循环链表的判空

不妨先设想一个链表 head -> node -> null;

循环就是最后循环到了head head -> node -> head;

如果为空时,node不存在,即 head -> next == head;

CAP定理

  • 一致性(C):在分布式系统中的所有数据备份,在同一时刻是否同样的值。(等同于所有节点访问同一份最新的数据副本)
  • 可用性(A):在集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求。(对数据更新具备高可用性)
  • 分区容忍性(P):以实际效果而言,分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在C和A之间做出选择。

三者不能都存在,因此要取舍

CA without P:如果不要求P(不允许分区),则C(强一致性)和A(可用性)是可以保证的。但放弃P的同时也就意味着放弃了系统的扩展性,也就是分布式节点受限,没办法部署子节点,这是违背分布式系统设计的初衷的。传统的关系型数据库RDBMS:Oracle、MySQL就是CA。

CP without A:如果不要求A(可用),相当于每个请求都需要在服务器之间保持强一致,而P(分区)会导致同步时间无限延长(也就是等待数据同步完才能正常访问服务),一旦发生网络故障或者消息丢失等情况,就要牺牲用户的体验,等待所有数据全部一致了之后再让用户访问系统。设计成CP的系统其实不少,最典型的就是分布式数据库,如Redis、HBase等。对于这些分布式数据库来说,数据的一致性是最基本的要求,因为如果连这个标准都达不到,那么直接采用关系型数据库就好,没必要再浪费资源来部署分布式数据库。

AP wihtout C:要高可用并允许分区,则需放弃一致性。一旦分区发生,节点之间可能会失去联系,为了高可用,每个节点只能用本地数据提供服务,而这样会导致全局数据的不一致性。典型的应用就如某米的抢购手机场景,可能前几秒你浏览商品的时候页面提示是有库存的,当你选择完商品准备下单的时候,系统提示你下单失败,商品已售完。这其实就是先在 A(可用性)方面保证系统可以正常的服务,然后在数据的一致性方面做了些牺牲,虽然多少会影响一些用户体验,但也不至于造成用户购物流程的严重阻塞。

文章末尾请带上以下文字及链接:本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情