笔者在2022年7月份-9月份之间面试了很多golang和k8s相关的面试,主要想从事云原生相关的开发工作,大小公司面试了很多,现将整体面试感受和一些通用的问题做一些整理记录,帮助大家在面试的时候更好的进行准备。最近大环境不好,大厂的岗位也少了不少。
主要投递的岗位包含广州、深圳的岗位,面试的是golang工程师相关的岗位,但其实单纯做云原生相关岗位比较少,基本上局限于国内的几朵云,阿里云,华为云,腾讯云,最近发展起来的运营商赛道,天翼云,联通云这些。当然也包含也一些企业内部的私有云,规模应该不是很大。
面试过的公司有:腾讯,阿里,度小满,金山,字节,Fordeal,优维科技,致景科技,凯媒通信,联通数科,天翼云。
腾讯算法
腾讯腾娱项目组,好像云相关的没怎么招人,也可能岗位在西安,但听同事说没怎么招人,所以就面的是go业务代码开发,因为自己一直做的是k8s相关的开发,面业务代码的开发在技术栈上有一些不匹配,比方说,他们会对一些互联网三高项目比较重视,包 mysql,es,redis,kafka啊等等数据库要求相对高。这个当时由于没有准备Mysql调优相关的知识,一面就挂了。算法题目是二叉树相关的如下:
给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func buildTree(preorder []int, inorder []int) *TreeNode {
if len(preorder)==0{
return nil
}
root := &TreeNode{preorder[0],nil,nil}
i:=0
for ;i<len(inorder);i++{
if preorder[0]==inorder[i]{
break
}
}
root.Left=buildTree(preorder[1:len(inorder[:i])+1],inorder[:i])
root.Right=buildTree(preorder[len(inorder[:i])+1:],inorder[i+1:])
return root
}
阿里算法
阿里主要是蚂蚁金服在招跟云相关的岗位,一般都是电话面试,由阿里的hrg或者是hrg助理约面,对编程要求其实不算太高,算法考的是lru算法。题目如下,其实就是leetcode的146题。
请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。
实现 LRUCache 类:
LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存
int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。
void put(int key, int value) 如果关键字 key 已经存在,则变更其数据值 value ;如果不存在,则向缓存中插入该组 key-value 。如果插入操作导致关键字数量超过 capacity ,则应该 逐出 最久未使用的关键字。
type entry struct{
key,value int
}
type LRUCache struct{
cap int
cache map[int]*list.Element
lst *list.List
}
func Constructor(capacity int)LRUCache{ //LRU算法
return LRUCache{capacity,map[int]*list.Element{},list.New()}
}
func (c *LRUCache)Get(key int)int{
e := c.cache[key]
if e==nil{
return -1
}
c.lst.MoveToFront(e)
return e.Value.(entry).value
}
func (c *LRUCache)Put(key,value int){
if e := c.cache[key];e!=nil{
e.Value=entry{key,value}
c.lst.MoveToFront(e)
return
}
c.cache[key] = c.lst.PushFront(entry{key,value})
if len(c.cache)>c.cap{
delete(c.cache,c.lst.Remove(c.lst.Back()).(entry).key)
}
}
阿里一般只要稍微准备一下就可通过,其实接下来的几轮技术面才是关键,对深度的要求还是有点高,但是感觉面试官的态度还是很友好的,不会出现一言不合就开喷的情况,就是即使挂了你还是会笑嘻嘻的那种。(hr也都是笑嘻嘻的挂人)
字节算法
字节那边也是业务代码开发,主要也是飞书人力套件,用golang,好像没搜到字节跟云相关的岗位,字节不愧是算法问到了极致,每一面都考算法,难度到了有向无环图,这种,其中夹杂着mysql的各种问题,大概是他们是做OA人事薪酬系统,对mysql也是特别高,问了一些mysql的知识,会让你手写sql语句。算法题目如下:
题目一:
给定一个有序数组,但是数组以某个元素作为支点进行了旋转(比如,0 1 2 4 5 6 7 可能成为4 5 6 7 0 1 2)。给定一个目标值target进行搜索,如果在数组中找到目标值返回数组中的索引位置,否则返回-1。你可以假设数组中不存在重复的元素。
主要考察二分法:
func search(nums []int, target int) int {
if len(nums) == 0 {
return -1
}
left := 0
right := len(nums) - 1
for left <= right {
mid := (left + right) / 2
if target == nums[mid] {
return mid
}
if nums[left] < nums[mid] && target <= nums[mid] && target >= nums[left] {
right = mid - 1
} else if nums[left] > nums[mid] && target <= nums[mid] {
right = mid - 1
} else if nums[left] > nums[mid] && target >= nums[left] {
right = mid - 1
} else {
left = mid + 1
}
}
return -1
}
题目二:
给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
func spiralOrder(matrix [][]int) []int {
ans :=make([]int,0)
x,x1 := len(matrix),0
y,y1 := len(matrix[0]),0
zong := x * y
for {
for i1:=y1;i1<y;i1++{ //行固定的,列在动
ans =append(ans,matrix[x1][i1])
}
x1++
for i2:=x1;i2<x;i2++{
ans=append(ans,matrix[i2][y-1])
}
y--
for i3:=y-1; i3>=y1; i3-- {
ans =append(ans,matrix[x-1][i3])
}
x--
for i4:=x-1 ;i4>=x1;i4--{
ans =append(ans,matrix[i4][y1])
}
y1++
if len(ans)>=zong{
break
}
}
return ans
}
题目三:
循环依赖检测,看了一下字节的题库,发现是新题目被拿来考察算法能力,这里附上字节算法的题库。补充题:检测循环依赖 (qq.com)
题目四:
这道题考了mysql的一些知识,当时给了一个学生表,求SQL查每个学生成绩最好的科目,大家面字节的业务代码开发,就多学一些mysql的东西吧,多刷一下常见sql语句。
优维科技算法
优维科技:老实说当时投这家公司是练手的,觉得是个小公司,面试应该蛮简单,一面顺利通过,二面被叫到公司现场面试,刚到公司,技术总监叫我坐下,我想该不会去给我倒水去了吧,不用这么客气,然后该公司总监拿着一张纸进来了,定睛一看2道算法题,人都傻了,想着大厂都没叫我现场手撕代码,心里当时想着放弃,因为没必要,面上我也不去,但是只能硬着头皮去写了。主要是好长时间没写字了。
题目一:
二分查找有序数组中第一次出现数的位置。
public int search (int[] nums, int target) {
if(nums.length == 0) {
return -1;
}
int begin = 0;
int end = nums.length - 1;
while(begin < end) {
int mid = (begin + end) / 2;
if(nums[mid] < target) {
begin = mid + 1;
} else {
end = mid;
}
}
return nums[begin] == target ? begin : -1;
}
题目二:
操作给定的二叉树,将其变换为源二叉树的镜像。
package main
import . "nc_tools"
/*
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param pRoot TreeNode类
* @return TreeNode类
*/
func Mirror( pRoot *TreeNode ) *TreeNode {
// write code here
if pRoot==nil{
return nil
}
pRoot.Left,pRoot.Right =pRoot.Right,pRoot.Left
Mirror(pRoot.Left)
Mirror(pRoot.Right)
return pRoot
}
其他公司多为国企和小厂,对算法要求不是太高,看了一下,这些题目刷牛客101题基本都能包含,附上牛客101题的链接。其实面试刷这个101道,大多数公司够用了:https://www.nowcoder.com/exam/oj