Skip to content

【面试题】JS笔试题整理 #128

Open
@funnycoderstar

Description

@funnycoderstar

题目

  • 实现随机抽奖程序 接受一个数组 arr, n , 从数组中抽出n个人
  • 实现 sleep(5).then(console.log), sleep(4), sleep(5).then(console.log); 执行.then的时候才输出,执行sleep函数的时候不输出
  • 实现一个发布订阅模式和观察者模式
  • 斐波那契数列
  • 不使用新的变量交换两个变量的值
  • 实现一个Promise.all
  • 手写call/apply/bind
  • 手写函数防抖和节流
  • 实现一个 iterator
  • 实现一个 async函数(gernerator + promise版本)
  • 实现一个 new
  • 手写两列布局和三列布局(你知道的所有)

答案

  1. 实现随机抽奖程序 接受一个数组 arr, n , 从数组中抽出n个人

代码一:
按照我们正常的抽奖的最简单做法,一般是把工号写到一个球上面,摇 n 次,然后每次摇出1个号,该号码即为中奖号码,同时将该球拿出去,重复 n 次。

function foo(arr, n) {
    const result = [];
    let i = 0;
    while( i < n) {
        // 每次从数组中随机抽出一个值,使用 slice将该值从原数组数组中删除,将该值添加到 result中
        const value = arr.splice(Math.floor(Math.random() * arr.length), 1)
        result.push(value[0]);
        i++;
    }
    return result;
}

代码二:
还有一种思路是将数组打乱,直接截取 前 n 个数。就是著名的 洗牌算法。

打乱数组(洗牌算法):从最后一个元素开始,从数组中随机选出一个位置,交换,直到第一个元素。

function disorder(array) {
    const length = array.length;
    let current = length - 1;
    let random;
    while(current > -1) {
        random = Math.floor(length * Math.random());
        // 数组的每个值都会和另外一个随机位置的值交换位置
        // 使用数组的解构赋值,交换数组中的两个元素的位置
        [array[current], array[random]] = [array[random], array[current]];
        current--;
    }
    return array;
}
const arr1 = disorder(arr);
arr1.slice(0, n)

具体的可以查看下面几篇文章

  1. 实现 sleep(5).then(console.log), sleep(4), sleep(5).then(console.log); 执行.then的时候才输出,执行sleep函数的时候不输出
let count = 0;
function sleep(s) {
    count += s;
    return {
        then: () => {
            setTimeout(() => console.log(s), count * 1000)
        }
    }
}

sleep(3).then();
sleep(4);
sleep(5).then();
  1. 实现一个发布订阅模式和观察者模式

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions