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
13s=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
10import 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
37class 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
23select
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
14n, 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
10n = 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 | //输入12345 3 |
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 | 1)写一个字符串归一化程序,统计字符串中相同字符出现的次数,并按字典序输出字符及其出现次数。 |
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.如果列类型是字符串