阿里淘天实习生笔试经历
阿里淘天实习生笔试经历
0.笔试过程
笔试是在牛客网进行线上笔试,100分钟完成十五道选择题加三道编程题。其中选择题包括13道基础题,一半单选,一半不定项。再加一道指定语言(C++,Java,JS)的单选和一道不定项。我选的是Java的两道题
选择题考得比较基础,但是由于基本都是理论,所以很多题都拿不准。编程题离大谱,感觉都不像正常题。
1.选择题
选择题涉及的内容比较宽泛,包括以下内容:
- 图论,最小代价生成树,Prim算法(从指定顶点开始,逐个寻找最短权值的与已构建图的相邻边)
- TCP/IP协议的特点
- 完全二叉搜索树,层序遍历
- 设计模式,给定场景选用设计模式。哪些设计模式是行为模式
- WebSocket服务器连接的关键词
- Linux shell初始化数组的方式
- chmod设置权限(权限,用户,其他用户)
- Java类加载器
- Java的static关键词,静态代码块执行顺序,静态方法能否访问非静态数据/非静态方法能否访问静态数据
- 文件保护措施(选项有保护表,加密,口令什么之类的,完全没接触过)
- 排序算法(最适合递归的是哪个)
(1).设计模式的分类
设计模式分为创建型、结构型和行为型。 具体分类如下图

(2).TCP/IP协议的特点
- TCP(Transmission Control Protocol)传输控制协议,TCP/IP协议不依赖于任何特定的计算机硬件或者操作系统
- 面向有连接的传输协议: 发送数据前需要建立连接,只有确认通信接收方存在时才发送数据,保证两端通信主机之间通信可达
- 可靠传输: 为处理数据丢失的问题,TCP协议可以通过重发来实现数据的可靠性。TCP通过检验和、序列号、确认应答、重发控制、连接管理以及窗口控制等机制实现可靠性传输。这样使得通过TCP传输的数据,无差错、不丢失、不重复。但是这样会消耗大量的时间,所以其效率低。
- 面向字节流: 数据仅被视为一串无结构字节流
- 用途: 用于传输可靠性的通信服务
- 点对点通信: 每条TCP连接只有两个端点,只能进行一对一连接通信
(3).UDP协议的特点
- UDP(User Datagram Protocol)用户数据报协议
- 面向无连接的传输协议: 发送前无需建立连接,减小开销和时延,需要通过应用程序检查数据包发送接受情况
- 面向报文: 将应用层交下来的报文,保留报文边界交付给IP层
- 不可靠传输: 无连接,只考虑发送,不考虑重发
- 用途: 适用于高速传输和实时性要求高,而又允许数据部分丢失的通信和广播通信(如DNS,SNMP,即时通信,应用通信)
- 无拥塞阻塞: 主机发送速率不受网络拥塞影响
- 一对一、一对多、多对一、多对多的交互通信: 单个或者多个端点之间可以互相连接
(4).Shell数组
Shell数组的表示法: Shell 创建数组用括号来表示,元素用"空格"符号分割开
#array_name=(value1 value2 ... valuen)
my_array=(A B "C" D)
也可以通过数组下标实现数组定义
array_name[0]=value0
array_name[1]=value1
array_name[2]=value2
Shell数组的读取: 读取格式如下
${array_name[index]}
使用 @ 或 * 可以获取数组中的所有元素 获取所有元素时,在数组名称前使用#可以获取数组长度
#!/bin/bash
my_array[0]=A
my_array[1]=B
my_array[2]=C
my_array[3]=D
echo "数组的第一个元素为: ${my_array[0]}"
echo "数组的元素为: ${my_array[*]}"
echo "数组的元素为: ${my_array[@]}"
echo "数组元素个数为: ${#my_array[*]}"
关联数组: 关联数组类似于Java中的Map,使用 declare 命令来声明,语法格式如下("-A"不能省略):
declare -A array_name
可以通过键值访问关联数组元素
获取所有元素时,在数组前加一个!可以访问所有键值
# declare -A array_name
declare -A site
site["google"]="www.google.com"
site["baidu"]="www.baidu.com"
site["taobao"]="www.taobao.com"
echo ${site["google"]}
echo "数组的键为: ${!site[*]}"
echo "数组的键为: ${!site[@]}"
(5).Linux chmod命令
chmod全称为change mode,该命令用于控制用户对文件的权限
Linux/Unix 的文件调用权限分为三级 : 文件所有者(u, Owner) 、用户组(g, Group) 、其它用户(o, Other Users)
只有文件所有者和超级用户可以修改文件或目录的权限。可以使用绝对模式(八进制数字模式),符号模式指定文件的权限。

r,w,x分别对应可读权限、可写权限和可执行权限
其中rwx可以通过二进制数表示权限情况,例如101表示r-x,开启可读、可执行权限,再将二进制转换为八进制,就可以用一个数字表示某类用户的权限情况,按照ugo的顺序可以表示权限分配情况 例如765,表示u=rwx, g=rw-, o=r-x
除了用=号直接设置权限以外,还可以通过+, -号对权限进行增减
可以用a(all)代替ugo
在Linux对某个文件file.txt设置权限的方法有以下几种:
#所有人增加可读权限
chmod a+r file.txt
chmod ugo+r file.txt
chmod +r file.txt
#设置特定权限,u=rwx,go=r
chmod u=rwx, go=r file.txt
chmod 744 file.txt
#向所有用户开放所有权限
chmod +rwx file.txt
chmod 777 file.txt
(6).WebSocket
待更新
(7).Java类加载器
见Java专栏
(8).Java的static关键词
见Java专栏
2.编程第一题
题目描述: 给定T个数组,每个数组分别给出数组长度n和k,以及数组本身数据,要求每个数组选择其中任意k个数,这k个数能形成的最大众数是多少(若有多个众数取最大那个)。
如下列输入:
2
6 4
3 3 3 2 2 2
4 2
1 2 3 3
T=2, 第一个数组的n=6,k=4,第二个数组的n=4,k=2 输出应为:
3
3
解释: 第一个数组,选取[3,3,3,2]或者[3,3,2,2]能得到最大众数3 第二个数组选取[1,3],[2,3],[3,3]都能得到最大众数3
第一眼一看是dp,但是状态转移想不明白,然后是排序,但是也感觉不太对。然后想到读取数组的过程用哈希表维护,记录每个数字的出现次数。 然后,然后我就不知道了,寄
顺便反思一下,没有google就不会调用Java的sort()方法了,也忘记比较器该怎么写了,开个部分复习一下
Java常用排序调用方法
int[] arr1 = new int[10];
ArrayList<Integer> arr2 = new ArrayList<>();
/**
* 1.Arrays.sort(),可以传int[],float[],char[],byte[]...等
* 只传一个数组时,对数组从小到大进行排序
*/
//对数组从小到大排序
Arrays.sort(arr1);
//对数组下标3-6从小到大排序
Arrays.sort(arr1,3,6);
//降序排序
Arrays.sort(arr1,Collections.reverseOrder());
/**
* 2.sort()方法,需要提供比较器方法
*/
//使用lambda表达式重写比较器,令其升序排序
//注意,比较器的返回值通过正负整数区分
//其中返回负整数表示需要进行交换位置
//返回正整数和0则保持原样
arr2.sort((a,b)->{ return a-b;});
3.编程第二题
题目描述: 每行给定三个数, ,每一行数对应一个未知的长为n+1的数组,其中,该数组满足,求每一行对应的数组的第k个数
题目很简单,我们要求的是,而通过递推式可以直接明确
,即
a[k] = a[n+1] % n % (n-1)% ... % (k+1) % k
好,直接循环送进去,喜提超时
感觉没法直接通过计算方式优化了,那么我们就考虑在循环上面进行优化。关键点在于,进行取模运算以后,得到的很有可能会是一个非常小的数,导致后面的多次取模计算都没有任何作用,所以我们只需要计算那些有效的取模运算即可。
例如9%7%6%5%4%3%2这则计算,计算完9%7=2以后,直到%2为止,都没有任何意义,所以可以直接跳过前面的%6%5%4%3直接去算%2
以此优化循环计算,完全通过
4.编程第三题
题目描述: 第一行输入数据,给定一个图的顶点数目和边数 下面每一行输入是两个顶点(加边),问每次加边后,加的这条边所在的连通块,其顶点数目是否等于边数,且不存在重边和自环。是则输出Yes,否则输出No
例:
5 5
1 2
1 3
2 3
4 5
4 5
输出:
No
No
Yes
No
No
前面三条边添加完毕后,123三个顶点所在连通块刚好三条边,等于顶点数,所以第三行输出Yes.
第四、五条边添加完毕后,虽然这个连通块里边数等于顶点数,但是存在重边,不符合要求,所以输出No.
没写完,不知道暴力dfs或者bfs能不能通过,我猜会超时。
如果这个方法不行的话,对不起,做不到.jpg