一道常被人轻视的web前端常见面试题(JS)

一道常被人轻视的web前端常见面试题(JS) 完整攻略

题目描述

假设有一个 getRandom() 函数可以随机生成 0 ~ 9 之间的整数,请编写一个 getRandomArray(n) 函数,返回长度为 n 的由随机整数组成的数组。

解题思路

这道题看起来比较简单,只需要使用 for 循环调用一遍 getRandom 函数,然后存储到结果数组中即可。具体实现如下:

function getRandom() {
  return Math.floor(Math.random() * 10)
}

function getRandomArray(n) {
  const res = []
  for (let i = 0; i < n; i++) {
    res.push(getRandom())
  }
  return res
}

注意点

但是这种实现方式有一个问题,如果生成长度超过 10 的随机数组,会导致有些数字无法出现。比如,若要生成长度为 11 的随机数组,那么必有一个数字无法出现。因此,这种方式并不是十分完美。

针对这个问题,我们可以使用洗牌算法。这个算法是一种在线性时间复杂度内把数组中元素打乱排序的算法。其实现方式如下:

  1. 初始化当前位置 currentIndex 为数组长度 array.length - 1
  2. 初始化交换位置的变量 temporaryValue
  3. 随机选择一个位置 randomIndex
  4. array[randomIndex]array[currentIndex] 交换位置
  5. 减少 currentIndex 的值,重复步骤 3 ~ 5 直到随机出当前元素

这样就可以保证随机数组生成的每个数字都会出现。

洗牌实现

function shuffle(array) {
  let currentIndex = array.length
  let temporaryValue, randomIndex

  while (currentIndex !== 0) {
    randomIndex = Math.floor(Math.random() * currentIndex)
    currentIndex--

    temporaryValue = array[currentIndex]
    array[currentIndex] = array[randomIndex]
    array[randomIndex] = temporaryValue
  }

  return array
}

然后,我们把 getRandomArray 函数改为:

function getRandomArray(n) {
  const res = []
  for (let i = 0; i < n; i++) {
    res.push(i)
  }
  return shuffle(res).slice(0, n)
}

示例说明

下面我们运行一下示例代码,验证一下结果:

const arr = getRandomArray(10)
console.log(arr) // => [4, 1, 6, 2, 5, 0, 8, 3, 9, 7]

总结

通过洗牌算法,我们可以生成一个随机数据集合,每个元素概率相等。所以,它是一个有效的满足大多数需求的随机数字生成算法。通过本题,让我们学会了如何在 JS 中完美地生成随机数数组。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:一道常被人轻视的web前端常见面试题(JS) - Python技术站

(0)
上一篇 2023年6月26日
下一篇 2023年6月26日

相关文章

  • img格式镜像转iso格式

    img格式镜像转iso格式 当你下载到一张.img格式的系统镜像,而你需要将其烧录为光盘或者制作成启动U盘,那么你就需要将其转换为ISO格式。本文将介绍如何将.img格式的镜像文件转换成标准的.iso格式。 安装相关软件 首先,我们需要安装 “geteltorito” 这个软件,它是一个非常小巧的命令行工具,专注于将.img文件转为.iso格式文件。在Deb…

    其他 2023年3月29日
    00
  • 微软Win10 SDK开发者工具已正式发布 附下载地址

    标题:微软Win10 SDK开发者工具已正式发布 附下载地址 首先介绍Win10 SDK开发者工具的概念以及作用,Win10 SDK开发者工具是一组开发工具和库,它可用于构建应用程序以运行在Windows 10操作系统上。开发人员可以使用Win10 SDK开发者工具,创建各种不同的应用程序,例如桌面应用程序、UWP应用程序、游戏、设备驱动程序,还可以开发各种…

    other 2023年6月26日
    00
  • word2007提示”无法初始化Visual Basic环境”的解决办法

    问题描述: 当使用Word2007打开某些带有宏代码的文档时,可能会弹出提示框:“无法初始化Visual Basic环境”的错误信息,这时无法运行宏代码。 解决办法: 方法一:重新注册dll文件 步骤1:关闭Word2007程序,打开Windows文件资源管理器。 步骤2:进入Windows目录下的SysWOW64文件夹。 步骤3:按住Shift键所在的同时…

    other 2023年6月20日
    00
  • 浅谈JS运算符&&和|| 及其优先级

    浅谈JS运算符&&和|| 及其优先级 引言 在JavaScript中,运算符&&(逻辑与)和||(逻辑或)是经常使用的操作符。它们用于组合和控制条件语句、条件表达式和布尔值。了解这两个运算符的使用和优先级对于开发高效的JavaScript代码至关重要。 逻辑与运算符(&&) 逻辑与运算符(&&)…

    other 2023年6月28日
    00
  • Android百度地图实现搜索和定位及自定义图标绘制并点击时弹出泡泡

    请见以下完整攻略: Android百度地图实现搜索和定位及自定义图标绘制并点击时弹出泡泡 一、前言 Android百度地图是一款非常强大的地图工具,它集成了很多常用的地图功能,包括地图展示、搜索、定位等,也可以通过开发者的自定义需求来定制地图的样式、交互和功能。其中,本文将介绍如何在Android中使用百度地图实现搜索和定位,并自定义绘制图标并点击时弹出泡泡…

    other 2023年6月25日
    00
  • Thinkphp5 如何隐藏入口文件index.php(URL重写)

    ThinkPHP5 是一款常用的 PHP 框架,其默认情况下网站会在URL中暴露“/index.php”,这不仅不美观,也容易被攻击者利用,以此进行一些不正当的访问和操作。因此,隐藏入口文件index.php是必不可少的保护措施之一。下面,我将为大家提供详细的攻略,让大家正确地完成操作。 步骤一:启用URL重写 在 ThinkPHP5 中,启用 URL 重写…

    other 2023年6月27日
    00
  • 为什么WINDOWS在运行里输入IP地址不能访问网络位置的解决办法

    解决Windows无法通过IP地址访问网络位置的问题攻略 如果在Windows操作系统中,在运行窗口中输入IP地址后无法访问网络位置,可能是由于网络配置或防火墙设置等问题导致的。下面是解决这个问题的完整攻略,包括两个示例说明。 步骤一:检查网络配置 确保IP地址正确:首先,确认输入的IP地址是正确的。检查IP地址是否与目标网络位置的IP地址匹配。 检查子网掩…

    other 2023年7月30日
    00
  • GPSCheat插件可以轻松自定义/更改手机GPS位置

    首先,让我给出这篇攻略的目录和大致流程: 目录 插件介绍 准备工作 安装GPSCheat插件 自定义/更改手机GPS位置 示例说明 结语 流程 下载并安装工具 打开GPSCheat插件 自定义/更改手机GPS位置 查看应用程序是否使用了新的位置信息 示例说明 下面,我将详细讲解每个步骤。 1. 插件介绍 GPSCheat插件是一款可以轻松自定义/更改手机GP…

    other 2023年6月25日
    00
合作推广
合作推广
分享本页
返回顶部