富途二面手撕代码
一面过了很快就约了二面,二面一半的时间在做题,还有说出打印结果的题。手撕代码考了三道题,分别是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);
代码解释:
- 函数
shuffleArray:接受一个数组作为参数,使用Fisher-Yates洗牌算法来打乱数组的顺序。- 从数组的最后一个元素开始,向前遍历数组。
- 对于每个元素,生成一个从0到当前索引的随机索引。
- 将当前元素与随机索引处的元素交换。
- 示例:创建一个原始数组,然后调用
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);
}
});
}
题目三:判断数组是否为子集
题目描述:
给定两个数组 a 和 b,判断 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;
}
总结
富途面试八股文和项目问的不是很多,特别喜欢做题,一半的时间做题。还有一些打印的题记不住就没分享了。