「这是我参与2022首次更文挑战的第2天,活动详情查看:2022首次更文挑战」。
虽然js,已经诞生25年了,但是它依然被认为是最复杂的语言之一,这门语言有很多概念,这么多年,发生了很多变化,旧的特性被删除或者修改,也添加了很多新的特性。
由于上面的这些原因以及其他原因, 要成为高级js程序员并没有那么的容易,本文将例举三个高级js程序员的面试题。
1.计算出最长不重复的子字符串的长度
在js中,字符串被大量的使用,所以面试官很关注字符串,字符串经常用于考察程序员的经验和水平。
下面这道面试题中,给定一个字符串,每个字符都是一个字母,如下所示:
let str = "abbbcabcdefef"
要求是找到最大不重复子字符串的长度,在上面字符串中,最长的不重复字符串是“abcdef”,所以答案应该是6。
解答这道题的第一种方案是使用循环和set。如下所示:
let getLength = function (str) {
let finalLength = 0;
for (let i = 0; i < str.length; i++) {
let currentString = new Set();
for (let j = i; j < str.length; j++) {
if (currentString.has(str[j])) {
break;
} else {
currentString.add(str[j]);
}
}
finalLength = Math.max(finalLength, currentString.size);
}
return finalLength;
};
const str = "abbbcabcdefef";
console.log(getLength(str));
在上面的这种方法中,循坏每个字符,每个字符都被添加到 Set 中,直到遇到重复字符,将其长度存储在变量中。这个算法虽然可以获取到正确的答案,但是效率不高
let getLength = function (str) {
let currentString = [];
let finalLength = 0;
for (let i = 0; i < str.length; i++) {
const currentCharacterIndex = currentString.indexOf(str[i]);
if (currentCharacterIndex !== -1) {
currentString.splice(0, currentCharacterIndex + 1);
}
currentString.push(str[i]);
finalLength = Math.max(finalLength, currentString.length);
}
return finalLength;
};
const str = "abbbcabcdefef";
console.log(getLength(str));
这个方法和前面的方法相类似,但是这个方法使用数组代替set来存储字符串。从而可以使用splice数组方法。
2.重组数组 - 数字优先,字母次之
给定一个包含字符串和字母的数组,要求以数字优先,字母次之的原则,重组数组。例如以下数组:
let arr = [2, "b", 4, "d", 3, "a", "c", "e", 5, 1];
结果应该是:[2, 4, 3, 5, 1, "b", "d", "a", "c", "e"];
基本的解决方案是使用数组和 for 循环。 但是,由于此面试题是针对专高级JavaScript 开发人员的,因此请使用现代数组函数,例如 filter()。
let numbersFirstAlphabetsSecond = (arr) => {
let numbers = [];
let alphabets = [];
let finalArr = [];
numbers = arr.filter((val) => typeof val === "number");
alphabets = arr.filter((val) => typeof val === "string");
finalArr = [...numbers, ...alphabets];
return finalArr;
};
let arr = [2, "b", 4, "d", 3, "a", "c", "e", 5, 1];
console.log(numbersFirstAlphabetsSecond(arr));
在这个方法中,数字和字母存储在独自的数组中。 然后,将它们合并为一个数组。
这个挑战可能会有额外的要求。 面试官可能会要求对数组中的数字和字母进行排序。 如果你知道正确的函数,将会非常容易。
let numbersFirstAlphabetsSecond = (arr) => {
let numbers = [];
let alphabets = [];
let finalArr = [];
numbers = arr.filter((val) => typeof val === "number");
alphabets = arr.filter((val) => typeof val === "string");
finalArr = [...numbers.sort(), ...alphabets.sort()];
return finalArr;
};
let arr = [2, "b", 4, "d", 3, "a", "c", "e", 5, 1];
console.log(numbersFirstAlphabetsSecond(arr));
这道面试题,主要考察的是数组处理能力,此外还考察对内置原生函数的熟练程度。
3.顺时针旋转二维矩阵
你可能在高级js程序员面试中遇到矩阵相关的面试题。在此面试题中,给定一个具有相同行数和列数的二维矩阵。 你需要以顺时针方向旋转该矩阵。 以下是一个 3 x 3 矩阵。
let m = [
[0, 1, 2],
[3, 4, 5],
[6, 7, 8],
];
结果应该是:
[
[6, 3, 0],
[7, 4, 1],
[8, 5, 2],
];
为了解决这道面试题,需要首先,转置(翻转 x 和 y 坐标)矩阵,然后反转它。
const clockWise = (mat) => {
for (let r = 0; r < mat.length; r++) {
for (let c = 0; c < r; c++) {
let temp = mat[r][c];
mat[r][c] = mat[c][r];
mat[c][r] = temp;
}
}
let finalMat = mat.map((r) => r.reverse());
return finalMat;
};
let m = [
[0, 1, 2],
[3, 4, 5],
[6, 7, 8],
];
console.log(clockWise(m));
在上面的方法中,首先对矩阵进行转置,然后在map()函数中使用reverse()函数,对转置的矩阵进行反转。
这个面试题难度较大,需要足够的矩阵问题解决知识。 开发者应该知道如何转置矩阵,这是解决这个问题的关键。
4.总结
高级js面试题具备一定的难度,面试可以是任何主题,但最受关注的是本文涉及到字符串、数组和矩阵,其他比较重要的主题是对象、正则表达式、数字、循环、函数和日期。