华为一面
部门:华为云(专门选了一个有前端业务的部门)
全程55min(问项目和基础13min,代码题给了半个小时来写)。
开始先问了问项目。
这个面试官是做算法的,所以问前端不多。
计网
问题1:网络的七层模型是哪七层?TCP需要哪几层的参与?
答:(在学校学的是五层混合模型,就答五层了)①从上到下:应用层,传输层,网络层,链路层,物理层。②TCP是传输层的协议,传输层及其以下的层次都要参与。
数据结构与算法
问题1:链表用过吗?反转链表怎么做?
答:一般的链表只有指向下一结点的指针,没有指向上一个结点的,所以在反转的过程中需要保存当前结点的上一结点,才能改变指针的指向。这样遍历一遍就可以完成反转。
问题2:从数组中删除一个元素的时间复杂度?
答:O(n)。查找是O(1),因为可以直接通过下标查找。但是如果删除一个元素就需要将后面的元素都往前挪一位,时间复杂度就是O(n)。
问题3:讲一下常见的排序算法(名称和时间复杂度)?JS中提供的排序方法用的是什么算法?(这题扑该了,只熟冒泡,还是得好好补一补排序算法)
答:常见排序算法:①冒泡排序,O(n^2)(双重for循环);②快速排序;③堆排序;等等
JS使用的排序算法:不同浏览器的实现不同,推荐阅读 (9) 深入浅出 JavaScript 的 Array.prototype.sort 排序算法 - SegmentFault 思否
JS
问题1:JS的字典知道吗?列表呢?
答:不知道...(后来一查才知道字典就是对象,列表就是数组,好家伙)
问题2:JS有哪些数据类型?
编程题
可以任选熟悉的语言写,也可以写伪代码,主要看思路。
(面试时是有了思路,但是没写完)
//函数功能:求阶乘 function factorial(n) { if (n === 1) { return 1; } else { return n * factorial(n - 1); } } //函数功能:对1~n这n个整数进行全排列,返回第k个排列(递增的顺序) function kth_number(n, k) { const arr = []; for (let i = 1; i <= n; i++) { arr.push(i); } return kth_number_core(arr, k); } //函数功能:对输入的数组中的所有数字进行全排列,返回第k个排列(递增的顺序) function kth_number_core(arr, k) { const len = arr.length; if (len === 1) { return arr[0]; } //seg意为以某一个数字开头的排列有多少个 const seg = factorial(len - 1); //first是要求的排列的第一个数字 let index = Math.ceil(k / seg) - 1; let first = arr[index]; //serialNumber是目标排列在自己所在的seg中的序号,注意处理目标序列是最后一个的情况 let serialNumber = k % seg ? k % seg : seg; //递归调用求出后面的排列 arr.splice(index, 1); //删掉被选中的数字 let str = first.toString(); return str + kth_number_core(arr, serialNumber); } console.log(kth_number(3, 3));
追问:这个算法的时间复杂度?
答:只考虑核心部分(kth_number_core)的话,就只需要考虑递归,大概在O(n)。