2022 猿辅导校招 Java 后端开发秋招
//
一面Java 基础
谈谈 Java 程序怎么实现跨平台兼容的?
比如现在有一个 windows 32 位环境下编译好的 Class 文件,放到 linux 64 位环境下,可以运行吗?
Javac 编译以后形成了 Class 文件,这个过程大致是怎么样的?
字节码直接就能执行吗,跟机器码有什么区别?
Java 进程跟线程的联系和区别?
线程有哪些状态呢?
wait() 和 sleep() 在面对锁的时候表现有什么不同?
计算机网络
客户端想和服务器建立 TCP 连接,要进行什么操作?
TCP 通信时,上层的应用对 TCP 收到的数据会怎么处理?
数据库
通常有哪些手段可以优化 MySQL 的查询效率呢?
说说联合索引失效条件?
怎么查看查询语句用到的索引呢?
算法题考了两道算法,不知道是我第一题做快了还是本来就准备考两道题。代码平台是牛客网。
将二叉搜索树转换为有序双向链表。调试不方便,简单写完核心逻辑(中序遍历放入 List 中再按序修改指针即可),讲完思路就算过了。
一个纯数字字符串,判断其是否可以通过加分隔点表示一个有效的 IP 地址(比如 “1111” 串可以 ...
面试综合技巧(不定期更新)
复盘面试中优化自己表现的软技巧。
//
1.话题引导对一个开放性多角度的问题,尽量朝自己熟悉的领域展开,回答的时候对不熟的领域不要过多涉猎,蜻蜓点水即可。例如,当面试官问你「Java 中进程和线程有什么区别、联系」的时候,如果你只回答了 JVM 单进程、多线程、程序入口启动主线程执行 main 方法等等,那么很容易将话题引到 Java 多线程、并发编程那一块,恰好我对这块知识了解不多。于是,我会再补一句「例如,JVM 在主线程之外,还可能会并发地运行 GC 线程」,这样话题就有可能进一步扩展到我相对更熟悉的 GC 方面,降低暴露我知识盲区的风险。我们就成功通过话题的引导,掌控了面试的节奏。
2022 华为云 BU 校招 Java 后端开发秋招
华为云 BU 校招 Java 后端开发,一面、二面面经
//
不知道是个例还是整个华为,至少我面的这个部门给我的面试体验相当好,面试官会当场给我比较积极的反馈,面试结束后 5 分钟内就发短信通知通过。美中不足的是笔试后面还有很长很罗嗦的性格心理测评题,个人说实话比较反感这类测评以及行测题,但总之瑕不掩瑜。
一面二面自我介绍,聊了聊非科班毕业后的一些不相干的工作经历,坦陈自己缺乏项目经验,于是面试官后面就问了些八股文。运气还不错,面试官的引导技巧也很在线,卡壳的地方也能引导我回答出来。
Java基础
了解 Java 哪些数据结构?
说说 HashMap 实现吧?
了解一致性 Hash 吗?
线程同步有什么需要注意的地方?设置锁,限制对资源的争夺。(多线程这块了解不多)
对 Java 的锁有什么认识吗?回答面试官对 Java 当中多线程不熟,锁的具体实现不了解,但是粗略了解一些操作系统涉及的锁的抽象原理,于是面试官让我从抽象的角度介绍锁。回答锁其实就是对某一种资源(某个对象、某个代码块)的分配限制,如果资源能分配若干份,锁就表现为信号量,如果资源是唯一的,锁就表现为二元互斥量。竞争中获 ...
2022 虾皮 Shopee 新加坡校招后端开发提前批
虾皮新加坡后端开发,一面、二面(凉)面经
//
先把我写在牛客网面经 贴上,等有空了整理搬过来
51. N 皇后
用回溯 + DFS 搜索可能的解,用位运算优化空间复杂度
//
题目链接-来源:力扣(LeetCode)
n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。
每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。
示例 1:
输入:n = 4输出:[[“.Q..”,”…Q”,”Q…”,”..Q.”],[“..Q.”,”Q…”,”…Q”,”.Q..”]]解释:如上图所示,4 皇后问题存在两个不同的解法。
思路:简化版的解数独。由于我们需要给出 n 皇后问题的所有解,因此考虑使用回溯 + DFS 的方法搜索每一个可能的解。暴力解的复杂度显然无法接受,我们每在棋盘放入一个皇后,就要维护一个冲突信息,记录与这个皇后相关的行、列、对角线,这样我们之后放置新的皇后时,就可以直接排除这些冲突的位置,即「剪枝」大大降低我们的解法复杂度。回溯时,我们需要用某种方式撤销掉与这个皇后相关的冲突信息,仿佛我们从未放置过它。本题各种 ...
50. Pow(x, n)
快速幂模拟 pow(x,n) 幂函数实现
//
题目链接-来源:力扣(LeetCode)
给定一个字符串数组,将字母异位词组合在一起。可以按任意顺序返回结果列表。
字母异位词指字母相同,但排列不同的字符串。
示例 1:
输入: strs = [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”]输出: [[“bat”],[“nat”,”tan”],[“ate”,”eat”,”tea”]]
思路:常规的 n 次累乘时间复杂度为 O(n),我们考虑对其进行优化。容易发现,如果采用分治的方法,计算 pow(x, n) 时,只需将 pow(x, n / 2) 的结果进行平方… 即可在 O(logn) 的时间内完成计算。当然,分治过程中有许多细节要处理,比如 n 为奇数时,我们要先单独乘一次 x,让 n 变为偶数后才能继续分治。为了高效完成分治,考虑快速幂的实现。我们将 n 视为二进制数,每次以其最低位为参考,若最低位为 1,表示当前 n 为奇数,我们就在结果中乘上 x;然后不论奇偶,我们都将 x 平方,并将 n 右移继续处理下一位,这个操 ...
49. 字母异位词分组
为字母异位词设置分配哈希值相同的数据结构
//
题目链接-来源:力扣(LeetCode)
给定一个字符串数组,将字母异位词组合在一起。可以按任意顺序返回结果列表。
字母异位词指字母相同,但排列不同的字符串。
示例 1:
输入: strs = [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”]输出: [[“bat”],[“nat”,”tan”],[“ate”,”eat”,”tea”]]
思路:观察可以发现,我们需要提取字母异位词之间满足一定的「等价性」,我们需要提取出能够表达这个等价性的某一个等价特征,作为放在哈希表中作为 key,而 value 指向一个结果列表,才能依次归类这些字符串。我们可以提取出一种方便处理的等价特征,比如将字母异位词按字典序排序以后得到的字符串,一定相同,我们可以以这个字符串作为 key 来执行哈希查找,快速定位到应该存放的结果集当中。排序方法多种多样,比如可以将字符串转化为字符数组,然后对字符数组执行排序。当然,设字符串长度为 m,总字符串个数为 n,考虑排序的复杂度此方法的整体复杂度为 O(nmlogm)。我 ...
48. 旋转图像
分类处理实现高效地矩阵旋转,找规律
//
题目链接-来源:力扣(LeetCode)
给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。
你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。
示例 1:
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]输出:[[7,4,1],[8,5,2],[9,6,3]]
思路:我们可以将矩阵分组,方便我们进行旋转操作。我们发现每一次旋转操作,对于某一个位置的元素,只有与其相对应位置的另外 3 个元素是真正与其相关联的,我们可以一次性将这关联的四个位置「打包操作」(以示例 1 为例,不论我们旋转的角度是多少度,四个角落处永远都是被 1、3、7、9 四个数字占据,并且其相对位置不变,所以我们将其视为一个整体打包操作)。这样我们只需遍历 1/4 规模的矩阵元素,以其作为起始元素,每一个起始元素与其相关联的另外 3 个元素划为一组同一操作。为了对齐考虑,方便我们按数字规律查找关联元素,我们可以这样查找起始元素:显然,我 ...
47. 全排列 II
用回溯 + DFS 搜索全排列(去重)
//
题目链接-来源:力扣(LeetCode)
给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。
示例 1:
输入:nums = [1,1,2]输出:[[1,1,2], [1,2,1], [2,1,1]]
思路:此题沿用 上一题 的模板即可。唯一的区别是,本题所给的数组中拥有重复元素,我们需要动用一点小技巧进行去重操作。首先将原数组排序,方便我们后续的比较。在每轮 dfs 查找数组中的每个元素时,我们用一个局部变量 prev 记录上一次访问过的元素,后续元素必须满足与 prev 不相同的条件我们才进行考虑。prev 的初始化可以选择一个不在值域中的数字,比如本题的值域是 [-10, 10],我取 -11。其他代码与上一题完全一样。
时间复杂度:O(n * n!)空间复杂度:O(n)
实现:12345678910111213141516171819202122232425262728293031323334353637class Solution { public List<Lis ...
46. 全排列
用回溯 + DFS 查找全排列
//
题目链接-来源:力扣(LeetCode)
给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
示例 1:
输入:nums = [1,2,3]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
思路:全排列的问题很直观,对于 nums 数组中的数字,我们可以用一个布尔型数组 visited[]将其标记为两类,一类是已经取到我们的结果集中的元素,另一类是尚未选择的元素。我们每次递归中,就按照一定的顺序(如,从后往前,或者从前往后,保证不遗漏即可),搜索 nums 中的尚未选择的元素,将其标为已选择(visited[i] 标记为 true),加入结果集,并在此基础上继续进行更深一层的 dfs。回溯发生在深层 dfs 返回之后,我们要恢复现场,将相关变量恢复为好像没有发生过本次 dfs 一样,包括从结果集中删除选择的元素(对于本题,即为结果列表最后一个元素),修改 visited[i]。递归中止的条件为结果集大小恰为 nums 的长度,表示 ...