前端手撕代码(富途二面)

669 阅读3分钟

富途二面手撕代码

一面过了很快就约了二面,二面一半的时间在做题,还有说出打印结果的题。手撕代码考了三道题,分别是promise.All、数组乱序、子集判断。

题目一:实现数组乱序

题目描述: 给定一个数组,要求使用JavaScript实现数组的乱序(即打乱数组中元素的顺序)。

解题思路: 实现数组乱序的一个常用方法是使用Fisher-Yates洗牌算法。这种算法通过遍历数组,从后向前依次随机交换当前元素与其之后任一元素的位置,从而实现数组的随机乱序。

代码实现:

function shuffleArray(array) {
  for (let i = array.length - 1; i > 0; i--) {
    const j = Math.floor(Math.random() * (i + 1)); // 生成一个随机索引
    [array[i], array[j]] = [array[j], array[i]]; // 交换当前元素和随机索引处的元素
  }
  return array;
}

// 示例
const originalArray = [1, 2, 3, 4, 5];
const shuffledArray = shuffleArray(originalArray.slice()); // 使用slice()来复制数组,避免修改原数组
console.log(shuffledArray);

代码解释:

  1. 函数 shuffleArray:接受一个数组作为参数,使用Fisher-Yates洗牌算法来打乱数组的顺序。
    • 从数组的最后一个元素开始,向前遍历数组。
    • 对于每个元素,生成一个从0到当前索引的随机索引。
    • 将当前元素与随机索引处的元素交换。
  2. 示例:创建一个原始数组,然后调用 shuffleArray 函数来打乱数组的顺序。使用 slice() 方法来复制数组,避免修改原始数组。

题目二:实现 Promise.all()

题目描述: 实现一个类似于 Promise.all() 的函数,该函数接受一个Promise数组作为输入,并返回一个Promise。当所有输入的Promise都被兑现时,返回的Promise也将被兑现,并返回一个包含所有兑现值的数组。

解题思路: 我们可以创建一个自定义函数 customPromiseAll,它接受一个Promise数组作为参数,并返回一个新的Promise。这个新的Promise将在所有输入的Promise都成功完成时被解决,或者在任何一个输入的Promise被拒绝时立即被拒绝。

代码实现:

function customPromiseAll(promises) {
  return new Promise((resolve, reject) => {
    const results = [];
    let completedPromises = 0;

    promises.forEach((promise, index) => {
      Promise.resolve(promise).then(value => {
        results[index] = value;
        completedPromises++;
        if (completedPromises === promises.length) {
          resolve(results);
        }
      }).catch(error => {
        reject(error);
      });
    });

    if (promises.length === 0) {
      resolve(results);
    }
  });
}

题目三:判断数组是否为子集

题目描述: 给定两个数组 ab,判断 a 是否是 b 的子集。

解题思路: 首先,我们需要确保 a 的长度不超过 b 的长度。然后,对两个数组进行排序。接下来,使用双指针技术从两个数组中同时查找元素,确保 a 中的每个元素都能在 b 中找到,并且 a 中的元素顺序在 b 中也相同。

代码实现:

function isSubset(a, b) {
  a.sort((x, y) => x - y);
  b.sort((x, y) => x - y);

  let i = 0, j = 0;
  while (i < a.length && j < b.length) {
    if (a[i] === b[j]) {
      i++;
    }
    j++;
  }
  return i === a.length;
}

总结

富途面试八股文和项目问的不是很多,特别喜欢做题,一半的时间做题。还有一些打印的题记不住就没分享了。