华为一面
部门:华为云(专门选了一个有前端业务的部门)
全程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)。

查看13道真题和解析