#3 面試面試官在簡單確認候選人姓名並詢問侯獲選人目前工作地點之後,說你應該了解位元組的面試流程吧?
朋友由於之前沒參加過字節的面試,一臉懵逼,問道請問流程是怎樣的,我是第一次參加字節的面試
。 ######面試官答案 先做幾題演算法。看你履歷上說有刷不少力扣題,那就先寫一道簡單題作為開胃菜吧#。
接著面試官開始出題了。
朋友(之前聽過位元組的演算法題不容易)心裡默想 What's the fuck, 你的簡單題不會特別難吧?
请写一个函数:string ConvertNum(string src, int src_base, int dst_base) 测试用例: ConvertNum("FF", 16, 10) = "255" ConvertNum("077", 8, 10) = "63" ConvertNum("10", 16, 10) = "16" 假设: 参数:src_base/dst_base = 2, 8, 10, 16 src >= "0" 假设没有任何前缀; 假设参数都正确; 假设参数都是非负数
20 分鐘內完成,越快越好,要求通過所有測試案例,程式碼盡可能簡潔。
#好久沒刷這種題了,看到題子之後, 沒思考清楚,一頓操作猛如虎,導致在不少細節出了問題。
#1、字串轉換成整數數函數atoi 的實作;
2、進位之間的轉換;
3、整數轉換為字串函數itoa 的實作。
一道看似簡單的基礎題,考察的東西還不少,需要採用「分治」的想法#。
朋友對面試官說 一般刷 leetcode,突然寫這種題很不適應。
面試官答道 那就看一道力扣的類似題。
面試官開始出題。
C++ typedef struct LinkListNode { int value; struct LinkListNode* left; struct LinkListNode* right; } LN, *PLN; bool IsBranch(PLN root, int *nodes, int length) 1 / \ 2 3 / \ 4 5 / \ 6 7 1 T 0 F 2, 3 F 1, 2, 3 T 1, 3, 5, 6 T 6, 5, 3, 1 T
面试官出完题之后,笑了笑说提示一下哈,本题可以找规律。
做了一段时间之后,大部分写出来了,但是还是有些细节没考虑好。
将这颗树看成一个族谱,如果输入的是一颗子树的话,必须要有父亲节点,比如 1, 3, 6,由于 6 没有父亲节点,所以输出肯定是 F;如果只有兄弟节点的话,同样输出也是 F。
面试官问 你刷题的时候,最擅长刷哪种类型的题目,数组 or 链表 or 二叉树 or 排序 or...?
朋友一想,最近自己刷 链表 的题目比较多,递归、迭代以及增加虚拟头节点等等解法都掌握了,而且听了慕课网 liuyubobo 老师的算法课中的链表部分,于是自豪地说 链表。
面试官说 那就看看链表的算法题吧。
朋友露出笑容问道 面试官,你不会出一道 hard 的链表题吧?
面试官哈哈大笑,答道 我还是有节操的,不会坑你的,不过如果你通过了这一面,下一面的算法题估计比较难。
说完面试官出题了。
给定一个单链表,在链表中把 L 个节点到 R 个节点这一部分进行反转。 示例1: 输入 [1, 2, 3, 4, 5] 1, 3 输出 {3, 2, 1, 4, 5}
朋友一看,面露喜色,这么简单的,而且这不跟力扣中某道题类似嘛?
面试官好像看出来啥了,笑着问 你如果做过这道题的话,你就说做过,我再给你换道题。
朋友答道 确实做过,哈哈。
面试官开始换题(出题)。
将一个链表 m 位置到 n 位置之间的区间反转,要求时间复杂度,空间复杂度。 例如: 给出的链表为 1->2->3->4->5->NULL,返回 1->4->3->2->5->NULL. 注意: 给出的满足一下条件: 1 ≤ m ≤ n ≤ 链表长度。
朋友一看,笑了,心想这不就是 leetcode 92. 反转链表 II 的原题嘛?于是乎很诚实地跟面试官说 这题我做过。
面试官面露微笑,说 继续换题,不过不用担心,我不坑你,做一道合并两个排序链表的题。
朋友听到 合并两个排序数组,心中一顿窃喜,这不还是 leetcode 原题嘛?
合并排序数组 typedef struct LinkListNode { int value; struct LinkListNode *next; }LN, *PLN; 示例: listA 升序(1, 3, 5, 7, 9) listB 降序(8, 6, 4, 2, 0) 返回:升序(0, 9) PLN mergeLinkList(PLN listA, PLN listB)
面试官果真不坑人,笑着说我提示一下哈 为了简单一点,这道题你可以不用考虑这两个链表中有相同值得节点。
朋友一想,这不简单嘛,力扣中已经刷过原题(合并两个已升序排列的链表),这道题只需要 把链表 B 反转一下,这是链表 B 就有序了,这样不就跟力扣的原题完全一毛一样了嘛,心中一顿窃喜,于是刷刷刷地写完了。
面试官看了看,说 如果链表 B 中的最后一个节点的值都大于链表 A 的最后一个节点的值呢?如果链表 B 中的第一个节点的值都小于链表 A 的第一个节点的值呢?
朋友想了想,好像也是,还要考虑 链表 B 中每个节点的值放到链表 A 中的什么位置,这还得遍历整个链表 B 和 链表 A,并跟面试官说了。
面试官说这就是本题的难点。
考虑几种特殊情况。
1、链表 A 和链表 B 都为空,直接返回即可。
2、链表 A 不为空,链表 B 为空,直接返回链表 A。
3、链表 A 为空,链表 B 不为空,翻转链表 B 并返回翻转后的链表 B。
4、鍊錶A 和鍊錶B 都不為空,遍歷鍊錶A 和鍊錶B 並將鍊錶B 中的節點(從後往前)向鍊錶A 插入,並記錄插入位置。
面試官笑著說 這題其實是欺負你們這種已經工作了的,那些學生有時間,每天可以刷題,刷得很熟練。
總結
#這次面試,「分治思想」考得比較多,一道程式設計題,往往可以分成幾道簡單的小的程式題,只有這些小的程式設計題能AC 之後,才能把它們組合成大的題AC 。
以上是決定你是否能進字節的幾題的詳細內容。更多資訊請關注PHP中文網其他相關文章!