3道高级js程序员的面试题

308 阅读3分钟

「这是我参与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面试题具备一定的难度,面试可以是任何主题,但最受关注的是本文涉及到字符串、数组和矩阵,其他比较重要的主题是对象、正则表达式、数字、循环、函数和日期。

译自:hackernoon.com/top-3-codin…