Thrift 相关知识点
Thrift 作为常用的RPC框架,我实习的项目也是以此构建的,因此记录相关知识点以备复盘。
//
Thrift 相关知识点需求:微服务为了实现技术解耦,业务上引入了「微服务」的概念,将不同的业务逻辑分散为独立的服务,需要时再相互调用,提高了可维护性和可靠性。
微服务的实现有如下两个痛点:跨语言调用不同功能间的跨进程调用(由于种种原因,这些功能可能由不同语言实现),需要解决跨语言的支持问题。跨语言调用的主体称作「工作单元」,可以是某个进程,也可以是某个内存中的数据结构。常见的跨语言场景可以按如下分类:
工作单元内部协作:直接解释某些脚本语言(如 Lua 等)。
工作单元外部协作:
单进程:动态链接库调用(通信的前提是不同语言之间有相同的二进制接口 ABI)
多进程:远程过程调用(RPC),thrift 就是用来实现 RPC 的一种方案。
Thrift 定义了一种中间语言(接口定义语言 IDL)来作为沟通的统一标准,再由自己的编译器将 IDL 分别编译为不同语言的代码(Java,C++,Python 等),或反向操作。
依赖底层细节调用方和服务提供方除了要声明 所需/ ...
Flexport 面试
Flexport 的风格跟大多数外企一样,主要考察做题。
//
一面考察了两道算法题(第二道当场没想出来,不确定后续是否还有其他题),题本身不难,可能自己有点钻牛角尖没做出第二问。在这里记录以供复盘。
随机字符串生成
输入:一个字符串 input,是一个由单词和空格组成的句子(无前导空格,无标点,单词之间仅以一个空格间隔,字符全是小写英文字母),以及一个整数 N 表示生成句子的单词个数。
输出:一个字符串 output,包含 N 个单词,这 N 个单词按照如下规则生成:在 input 句子中随机取一个单词,作为输出句子中的第一个单词,记为 word_1,(word_1 在句子中可能重复出现)。每一个 word_1 之后紧跟着的下一个单词,组成一个单词池,在这个池中继续随机抽取一个单词,作为句子的第二个单词,记为 word_2,…… 以此类推,直到句子有 N 个单词为止。如果某一步取到了 input 句子的最后一个单词,则下一个单词应该为 input 的第一个单词,即 input 可以视为一个字符串循环队列,各元素之间以空格分开,最终拼接而成。因为单词每次都是随机抽取的,所以对于 ...
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 个元素划为一组同一操作。为了对齐考虑,方便我们按数字规律查找关联元素,我们可以这样查找起始元素:显然,我 ...
