暑期实习面试

暑期实习面试记录

2020.04.17 美团测开面试

上来自我介绍,然后开始问项目。我介绍了一下之前那个交通枢纽的项目,瞎扯了一堆。然后开始问我一些Java的基础,包括集合框架,多线程和spring的一些东西。然后考了我一些写SQL的,排序一个班级的考试成绩。基础差不多就是这些。

然后给我一个场景,就是假设我是电梯质检员,如何检测单个和多个电梯。我就开始叙述我的思路,哪些地方是需要检测的,功能外观和硬件等等。然后他告诉我着重从用户方向去思考测试的地方。

后面问了一些实习时间相关的,我说我最多只能暑假两个月,他说时间太短了。而且我本来是投的成都的base,给我转推到上海去了。没办法我就只好拒绝了,感觉技术都是过关了的。是我离大厂最近的一次了(难受。

2020.04.16 Thoughtworks面试

这个笔试完成之后就是一个一面,针对那道题说出你的思路。我本来以为没机会了,结果通知我二面。二面时间半小时,我还记错时间了,HR小姐姐打电话给我才想起来。

二面针对我的简历,问了一些项目相关的,包括整个系统的规划,任务分类,我负责的模块。

2020.04.12 快手java开发笔试

两个小时四道编程题目。第一道10分钟搞定,后面卡了好久,感觉紧张就写的东西容易出问题,总共A了两道。

第一题是计算圆括号的配对数、落单左括号数、落单右括号数。不用判断表达式是否成立,直接算就行。

1
2
3
4
5
6
7
8
9
10
11
12
13
s=input()
p=r=0
stack=[]
for c in s:
if c=='(':
stack.append(c)
elif c==')':
if stack:
p+=1
stack.pop()
else:
r+=1
print(p,len(stack),r)

第二题幂因子判断,注意无序以及去重,这里想了好久,最后还是A了。

1
2
3
4
5
6
7
8
9
10
import math
class Solution:
def GetPowerFactor(self , R , N ):
ans = []
for i in range(math.floor(math.log(R,N))+1):
if R%N>1: return []
elif R%N==1: # R%N 表示 R在从右往左第i+1位上的数值
ans.append(i)
R//=N
return ans

第三题排队就餐问题,乱写了一通,过了20。

第四题最大可办公员工数,最先以为暴力可以做,后面推倒重来。乱写一通过了60.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
class Solution:
def GetMaxStaffs(self , pos ):
n = len(pos)
m = len(pos[0])
can=[]
for i in range(n):
for j in range(m):
if pos[i][j]=='.':
can.append((i,j))
l = len(can)
ma=0
# who: 现在开始研究第i个工位(i从0开始), i之前的工位都已经安排好了
# cnt: 目前已经使用了的工位数量
# 无返回值
def dfs(who, cnt):
nonlocal ma
if who==l:
ma=max(ma, cnt)
return
i,j = can[who]
# 是否有相邻的工位被使用
flag = 0
for d in [-1,0],[1,0],[0,1],[0,-1]:
ni = i+d[0]
nj = j+d[1]
if 0<=ni<n and 0<=nj<m and pos[ni][nj]=='$':
flag=1

if not flag:
pos[i][j]='$' # 使用这个工位
dfs(who+1, cnt+1) # 先判断dfs(who+1, cnt+1)
pos[i][j]='.' # 撤回这个工位

dfs(who+1, cnt) # 再判断dfs(who+1, cnt)

dfs(0,0)
return ma

参考链接:https://www.nowcoder.com/discuss/406337?type=0&order=0&pos=7&page=1

2020.04.11 网易互娱数据分析笔试

两个小时,选择加SQL题。好久没写SQL了,四道题只A一个,哭了。第一次投数据分析岗,不知道考什么,以为和数据挖掘一样考编程题,没准备SQL,下次得提前准备一下看看考些什么。

重点还是说SQL题。

第一个是用户登录表,登录时间,用户id和产品名称,选出产品个数大于2的用户ID和产品名。

1
select user_id ,count(product)  from (select user_id, product from t_user_login GROUP BY user_id,product)t GROUP BY user_id  having count(product)>=2;

第二题还是用户登录表,选每个产品登录用户数和用户ID包含“NetEase”的用户数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
select
a.cnt1 as cnt1
,(case when b.cnt2 is null then 0 else b.cnt2 end) as cnt2
from
(
select
product
,count(distinct a.user_id) as cnt1
from
t_user_login a
group by product
)a
left join
(
select
product
,count(distinct user_id) as cnt2
from
t_user_login
where user_id like '%a%'
group by product
)b
on a.product = b.product;

第三题给了一个价格表,选出成交价格排名前五的产品和总价。

第四题分段统计并输出价格。

2020.04.09 美团点评笔试

两个小时,五道编程题。只AC了一道,后面都差好多。我还是太菜了,写题的时候太紧张,感觉都写不动。还是该多写一点注释。

第一道是时间计算,模拟一下就搞定,只是要注意日期。

第二道是排队,我用了两个Set去做交集,过了45。

第三道是个等比数列模拟的题,我看成了数学计算,一直在那里算公式,方向错了,最后9%。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
n, k = 10, 3
ans = -1
for i in range(n // k * (k - 1), n + 1):
total = 0
ii = i
while ii:
total += ii
if total >= n:
ans = i
break
ii //= k
if ans != -1:
break
print(ans)

第四道是四面体走s步返回原点,求有多少个走法,这个题完全不会,猜了个9%。

1
2
3
4
5
6
7
8
9
10
n = 3
a, b = 1, 0
for i in range(1, n + 1):
if i % 2 == 1:
a = (3 * b) % 1000000007
b = a + 1
else:
a = (3 * b) % 1000000007
b = a - 1
print(a)

第五题字符串匹配,走了个暴力模拟,9%。

2020.04.08 招商银行笔试

两道编程题,十二道选择,选作题有点瞎扯的感觉。两个小时。重点说编程题。

第一道是镜像回文,很简单但是我输入输出搞了半天。

第二道是加减组合计算的符合结果,想到是动态规划,死活写不出来,哭了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
//输入12345 3
//在字符串12345之间插入加号和减号得到3,有多少种方式
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int t = in.nextInt();
String[] strs = new String[t];
int[] ks = new int[t];
for(int i=0;i<t;i++){
strs[i] = in.next();
ks[i] = in.nextInt();
}
for(int i=0;i<t;i++){
// System.out.println(strs[i]);
// cal(new StringBuilder(),)
System.out.println(cal(strs[i],strs[i].length()-1,strs[i].length()-1,ks[i]));

}
// System.out.println(cal("12345",4,4,3));
in.close();
}
public static int cal(String s,int i,int j,int k){
int res = 0;
for(int m=i;m<=j;m++){
res=10*res+(s.charAt(m)-'0');
}
if(i==0){
if(k==res){
return 1;
}else{
return 0;
}
}
int count = cal(s,i-1,i-1,k-res)+cal(s,i-1,i-1,k+res)+cal(s,i-1,j,k);
return count;
}
}

2020.04.03 米哈游笔试

两个小时,10个选择2个编程题,1个自由发挥的设计题。着重说编程题,两道都是hard。

第一道是正则表达式,匹配(),*,.,调包过了80。真的不会手写只好调包了。

第二个题是监控二叉树,leetcode编号968。原题比leetcode还难一点,给的初始数据结构是字符串非二叉树的。直接pass了。

选择题都是基础没啥可说的。设计题需要设计定时器,满足palyer的定时机制,我整了一个hashmap上去,估计也是凉了。

2020.03.04 腾讯

投了腾讯的后端开发实习,转推到运营开发去了。不得不说这个面试官是我遇到最恶心的。问题记录一下:

问题

给两个域名,判断A是否是B的子域名。

这个我一开始想得很简单,直接两个字符串判断包含关系。

TCP和UDP的区别

面向连接和非连接,前者全双工。

hashmap的构成

数组加链表。

怎么实现A点到B点的路径查找

BFS,DFS和A星算法

1亿个数据怎么查中位数

这个没答上来,说了快排。查了一下改进快排或者桶排就可

linux命令

问了一堆,有的答上来有的没有。

这个面试官说话阴阳怪气的,面试体验极差。希望后面不要遇到这种人了。

附录再更一点这几天的笔记。

2020.03.09蚂蚁金服

晚上开会完突然打电话过来就开始面试了(我吓了一跳)。主要还是Java技术栈考察,不得不说阿里系就是Java啊。因为是电话面试,感觉还没有这么紧张,下面罗列一下问题。

ArrayList和HashMap的构造:前者数组,后者数组+链表+红黑树。

HashMap为什么用红黑树:这个没答上,应该是加快查询速度。https://blog.csdn.net/weixin_43258908/article/details/89174471

描述简历上项目的工作:油气田开发和交通枢纽开发的东西我又复述了一遍。

后面开始做题:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
1)写一个字符串归一化程序,统计字符串中相同字符出现的次数,并按字典序输出字符及其出现次数。
// 如字符串"babcc"归一化后为"a1b2c2"
public String fun1(String a){
HashMap<Charater,Integer> map = new HashMap<Charater,Integer>();
for(char c:a){
map.put(c,map.getOrDefault(c)+1);
}
StringBuilder sb = new StringBuilder();
for(Entry e:map){
sb.append(e.getKey());
sb.append(e.getValue());
}
return sb.toStirng();
}
//这里的遍历放入sb是有问题的,因为放入HashMap不能保证有序,需要使用有序遍历HashTable之类的才可以


2)实现对一个List通过DSL筛选
QList<Map<String, Object>> mapList = new QList<Map<String, Object>>;
mapList.add({"name": "hatter test"});
mapList.add({"id": -1,"name": "hatter test"});
mapList.add({"id": 0, "name": "hatter test"});
mapList.add({"id": 1, "name": "test test"});
mapList.add({"id": 2, "name": "hatter test"});
mapList.add({"id": 3, "name": "test hatter"});
mapList.query("id is not null and id > 0 and name like '%hatter%'");

QList<Map<String, Object>> mapList2 = new QList<Map<String, Object>>;

for(Map<String,Object> map:mapList){
String name = map.get("name");
String hatter = "hatter";
for(char c:name){
for(char c1:hatter){
if(c!=c1){
break;
}

}
}
if(map.get("id") > 0 && ){
mapList2.add(map);
}
}
return mapList2;
//这里的问题是没有写出来KMP的字符串匹配,也没想到其他的方法
//还有一个问题是如果这条件从and变成or上面的代码就无法使用了,需要对每个条件分别查询再去做集合操作才是正确思路


// 3)有个学生成绩表t_student_score,包含name(姓名),score(成绩),查询出成绩前3的所有学生
select name from t_student_score

//这个是真的不会,SQL的复杂写法确实忘了
//https://blog.csdn.net/weixin_42159940/article/details/94742024

// 4)任意一种排序算法
public void paixu(int[] a){
for(int i = 0;i<a.length()-1;i++){
for(int j = i+1;j<a.length();j++ ){
if(a[i]<a[j]){
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}
}
//面试官让我调优这个冒泡排序,我隐约记得一个flag的方法,但是没写出来
//https://blog.csdn.net/hansionz/article/details/80822494

2020.03.09 腾讯

下午腾讯面的时候一直在问简历,重点是看项目。他先问了油气田那个项目,我感觉自我陈述的时候还是有很多问题。他问到那个关于文件和数据库系统读写慢的时候,我的回答还是太菜了。(哎

第二个交通枢纽平台的陈述,我的简历写的工作负责的业务部分写的含混不清(确实太蠢了),这里该把简历好好改一下,突出重点。

后面又让我写了一些C++的代码,确实好久不写这个忘得差不多了(泛型完全就是Java的写法了)。

总而言之,我的简历还是有好多问题。这次的面试主要是围绕项目来讲的,对基础知识考察并不深入(感觉像是在二面),面试官说他们部门用C++,说我的技术栈时候做web后端,把我转推出去。我自己觉得还是说不管做什么样子的开发,能深入进去搞就好,不知道还有没有下次机会。

2020.03.30 阿里笔试

一个小时两道题,第一道模拟,第二道数论。全0(太菜了)。

第一题需要用堆排序,我写成标记最大值了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
用堆,初始把所有数推进去,然后每次取得堆顶,加上当前天数*k再取一半,推进堆时候再减去当前天数*k,这样堆里面所有元素相当于存的是所有鸡场都没加新的鸡,这样避免了每次要把所有鸡场都计算一遍,同时用一个变量每轮加上k*n,代表堆里少记了多少只鸡

import java.util.Scanner;
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
//3 3 100 nmk
// 100 200 400 ge shu
//m是天数 k是增加量
Scanner in = new Scanner(System.in);
String s1 = in.nextLine();
String s2 = in.nextLine();
String[] str1 = s1.split(" ");
String[] str2 = s2.split(" ");
// preOrder[i] = Integer.parseInt(str1[i]);
// String[] str = in.nextLine().replace("[", "").replace("]", "").split(",");
// int n = in.nextInt();
in.close();
//code here
int n = Integer.parseInt(str1[0]);
int m = Integer.parseInt(str1[1]);
int k = Integer.parseInt(str1[2]);


// System.out.println("n:"+n);
// System.out.println("m:"+m);
// System.out.println("k:"+k);

int arr[] = new int[n];
for(int i=0;i<n;i++){
arr[i] = Integer.parseInt(str2[i]);
}

for(int i=0;i<m;i++){//天数
int max = 0;
int idx = 0;
for(int j=0;j<n;j++){
arr[j]+=k;
if(max<arr[j]){
max = arr[j];//这里需要用堆去更新,不然就是超时了
idx = j;
}
}
//最大除2
arr[idx] = max/2;
}
int ans = 0;
for(int i=0;i<n;i++){
ans+=arr[i];
// System.out.println(arr[i]);
}

//ans
System.out.println(ans);
}
}

第二题压根就没心情做了,随便写了个交了。

附录-知识点整理

HashMap原理:链表加数组

解决hash冲突的办法

  • 开放定址法(线性探测再散列,二次探测再散列,伪随机探测再散列)
  • 再哈希法
  • 链地址法
  • 建立一个公共溢出区

StringBuilder和StringBuffer的区别:StringBuilder的方法不是线程安全的

synchronized的四种锁的状态。级别从低到高依次是无锁状态,偏向锁状态,轻量级锁状态和重量级锁状态。

CurrentHashMap原理:CurrentHashMap解决多线程安全,与HashMap和Hashtable 最大的不同在于:put和 get 两次Hash到达指定的HashEntry,第一次hash到达Segment,第二次到达Segment里面的Entry,然后在遍历entry链表.

synchronized具有同步功能,是一种互斥锁,锁的是对象,synchronized修饰普通方法时,锁对象是this对象。修饰静态方法时,锁对象是字节码文件对象。

Lock可以知道线程有没有成功获取到锁,多个线程都只是进行读操作时,线程之间不会发生冲突

ArrayList基于数组,LinkedList基于链表,LinkedList插入删除更快;ArrayList查询更快即可

Excutor线程池,着重强调使用过FixedThredPool,实际创建的都是一个ThreadPoolExecutor对象,线程池创建时的参数,corePool核心线程数,maximum最大线程数,时间,以及阻塞队列

讲讲TCP和UDP的区别:TCP三次握手,更加可靠

HTTP1.0, HTTP1.1和 HTTP2.0的区别:HTTP1.0默认短连接,可以长连接,HTTP1.1默认长连接,HTTP2.0支持二进制传输数据,实现多路复用,HTTPS在 HTTP协议基础上加入了安全协议ssl

数据库引擎有哪些?InnoDB Myisam Memory,InnoDB支持事务,支持外键,支持行锁,写入数据时操作快,Myisam不支持事务。不支持外键,支持表锁,支持全文索引,读取数据快 https://www.cnblogs.com/zhangchaoyang/articles/4214237.html

索引的底层:二叉树-》平衡二叉树AVL-》B树-》B+树 https://www.cnblogs.com/zhangzhijian/p/11237178.html

GC策略说说:整体使用的分代回收算法,年轻代使用copy算法,年老代使用标记管理算法,都可以避免产生碎片

JVM内存模型:栈描述的是Java方法执行的内存模型。堆存放的对象是线程共享的,所以多线程的时候也需要同步机制。方法区同堆一样,是所有线程共享的内存区域。https://www.jianshu.com/p/76959115d486

TreeMap原理:Entry 红黑树

检测sql语句的运行时间:show profile

存储过程:一次编译后永久有效,为了完成特定功能的SQL语句集

Object类中的11种方法:toString()equals(Object obj)hashCode()getClass()clone()finalize()

Python基本数据类型一般分为:数字、字符串、列表、元组、字典、集合这六种基本数据类型。

事务的特性:原子性、一致性、隔离性、持久性。

经常变化的字段用varchar;知道固定长度的用char;超过255字节的只能用varchar或者text;

线程的实现方式有哪些 extend Thread、implement runnable、implement callable

进程是资源分配的最小单位,线程是程序执行的最小单位。

什么情况下设置了索引但无法使用?如果条件中有or,2.对于多列索引,不是使用的第一部分,则不会使用索引,3.like查询是以%开头4.如果列类型是字符串