c++中怎么数组内有用元素的个数_前端面试(算法篇) - 数组乱序

一、面试题

77290bb5861643434724f578c6059e25.png

问:有一个长度为 100 的数组,如何从中随机挑选 50 个元素,组成一个新的数组?

答:这个...那个...emmmmmm

问:那先不挑 50 个,就挑一个数,知道怎么做吗?

答:这个我知道!随机生成一个 0 ~ 99 的数,然后去原数组取对应位置的元素就可以了~

let randomIndex = arr[Math.floor(Math.random() * arr.length)];

问:好,回到最初的问题,怎么挑选 50 个元素?

答:我知道了,在 0 ~ 99 的范围内,随机生成 50 个不重复的数字!

问:是这个思路,具体的实现呢?记得保证效率哦。

答:(吧啦吧啦吧啦)

问:现在假设数组的元素都是 String 类型,如果要把这个数组元素的顺序打乱,有什么办法么?

答:数组的 sort() 方法可以传入一个函数作为参数,这个函数的返回值可以决定排列顺序。在这个函数中写一个随机数,然后就能乱序了。

问:这是一个思路,但这只是伪随机。

答:啊咧?

问:听说过“洗牌算法”吗?

6d3a9dd82656549b98f099496bc64450.png

二、随机取数

按照上面随机挑选一个数的思路,从原数组中随机抽取一个数,然后使用 splice 删掉该元素

function getRandomArrElement(arr, count) { let res = [] while (res.length < count) { // 生成随机 index let randomIdx = (Math.random() * arr.length) >> 0; // splice 返回的是一个数组 res.push(arr.splice(randomIdx, 1)[0]); } return res}

上面生成随机 index 用到了按位右移操作符 >>

当后面的操作数是 0 的时候,该语句的结果就和 Math.floor() 一样,是向下取整

但位操作符是在数值表示的最底层执行操作,因此速度更快

// 按位右移(Math.random() * 100) >> 0// Math.floorMath.floor(Math.random() * 100)/* 这两种写法的结果是一样的,但位操作的效率更高 */

三、通过 sort 乱序

首先认识一下 Array.prototype.sort()

这个方法可以传入一个参数 compareFunction,这个参数必须是函数

同时 sort() 会暴露出 Array 中的两个元素 (a, b) 作为参数传给 compareFunction

sort() 会根据 compareFunction(a, b) 的返回值,来决定 a 和 b 的相对位置:

  • 如果 compareFunction(a, b) 小于 0 ,那么 a 会被排列到 b 之前;
  • 如果 compareFunction(a, b) 大于 0 ,那么 b 会被排列到 a 之前;
  • 如果 compareFunction(a, b) 等于 0 , a 和 b 的相对位置不变(不稳定!)

根据以上规则,可以在 compareFunction 中生成一个随机数,然后根据随机数做运算,返回一个正负未知的 Number,从而实现乱序

function randomSort(a,b) {  return .5 - Math.random(); }let arr = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'];arr.sort(randomSort);

但这并不是真正的乱序,计算机的 random 函数因为循环周期的存在,无法生成真正的随机数

四、Fisher–Yates shuffle 洗牌算法

773d3c3b56a30b5dee19cd77978eb157.png

洗牌算法的思路是:

先从数组末尾开始,选取最后一个元素,与数组中随机一个位置的元素交换位置

然后在已经排好的最后一个元素以外的位置中,随机产生一个位置,让该位置元素与倒数第二个元素进行交换

以此类推,打乱整个数组的顺序

function shuffle(arr) { let len = arr.length; while (len) { let i = (Math.random() * len--) >> 0; // 交换位置 let temp = arr[len]; arr[len] = arr[i]; arr[i] = temp; } return arr;}

再结合 ES6 的解构赋值,使用洗牌算法就更方便了:

Array.prototype.shuffle = function() { let m = this.length, i; while (m) { i = (Math.random() * m--) >>> 0; [this[m], this[i]] = [this[i], this[m]] } return this;}

五、用洗牌算法随机取数

再回到从长度为 100 的数组中取 50 个数的问题

之前用的是 splice 修改原数组,如果结合洗牌算法,又会有别的思路

最好是自己先思考一下,然后再展开代码进行比较

function getRandomArrElement(arr, count) { let shuffled = arr.slice(0),  i = arr.length,  min = i - count,  temp,  index; while (i > min) { index = Math.floor((i--) * Math.random()); temp = shuffled[index]; shuffled[index] = shuffled[i]; shuffled[i] = temp; } return shuffled.slice(min);}

用洗牌算法从数组中随机取数

最后放个彩蛋,关于两种随机取数的性能孰优孰劣

我用 Array.form 生成了一个长度为一百万的数组,然后从中随机取十万个数

首先是使用 splice 的方案:

76d61a8a0ca5f693049a7aab6af9ff94.png

然后是洗牌算法:

9e47aa058fa0d9d72d927416b72a136f.png

希望对你有用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/411277.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

axios+Vant+vue+jq重构jq月经周期计算器源代码(兼容移动端)

我是歌谣 代码重构不易 公众号关注小歌谣 前言 网络上流行了一款jq生成月经计算器的代码 是这样的 实现效果如图所示 本次讲解就是说明如何用VantjqVue实现此代码的重构 先看一眼重构演示的效果 这个是可以直接进行接口调用的 首先我们看一眼目录结构 我们这边贴出我自己手…

html页面高度设为自动,html – CSS:响应式布局中的高度自动问题

没有固定的正确高度.如果我在css中设置固定高度,则在响应式布局中,图像将不会以正确的宽高比调整大小.主要问题是css根据src-attribute设置的图像计算自动高度和宽高比,而不是width-和height-attribute.因此,如果有一个有宽度和高度的真实图像,一切正常.但是如果有一个空白(这只…

MVC Controller与ActionResult的返回值

Action的要求• 必须是一个公有方法• 必须返回ActionResult类型• 必须是实例方法• 不能是范型方法• 没有标注NonActionAttribute• 不能被重载&#xff08;overload&#xff09; Controller 提供了众多的方法让我们返回各种类型的 ActionResult。 1. View最常用的一种&…

事务处理

第13章 事务处理 事务处理是包含一个或多个任务的一组关联操作的提交或回滚操作。在事务执行的过程中&#xff0c;保证事务具有基本的ACID属性&#xff08;原子、一致性、隔离和持久性&#xff09;。.NET Framework的事务管理支持多种事务处理方式&#xff0c;包括显性事务和隐…

为多孔介质的当量直径_多孔介质流建模简介

拥有一款先进的多孔介质建模工具&#xff0c;是许多行业的刚性需求。COMSOL Multiphysics 软件 5.5 版本新增的附加产品——多孔介质流模块&#xff0c;可以满足众多行业的需求。使用该模块可以定量研究多孔介质中的质量、动量和能量传递。该模块适用于燃料电池、纸浆和纸张干燥…

北航计算机网络 传输层实验,北航研究生计算机网络实验_实验七 传输层实验

** 这个实验我没有约到没有问题的机子(连续三台机子都是坏的...)因此仅供参考1、根据2.6中步骤3回答&#xff1a;TCP的连接和建立采用的是&#xff1a;三次握手方式&#xff0c;PCA是主动打开方(C)&#xff0c;PCB是被动打开方(S)。先点击发送再点击接收&#xff0c;会出现什么…

python 竖线 绘图_Python可视化 | Seaborn5分钟入门(二)——barplot countplot

Seaborn是基于matplotlib的Python可视化库。 它提供了一个高级界面来绘制有吸引力的统计图形。Seaborn其实是在matplotlib的基础上进行了更高级的API封装&#xff0c;从而使得作图更加容易&#xff0c;不需要经过大量的调整就能使你的图变得精致。注&#xff1a;所有代码均在IP…

计算机网络工程综合布线目的,弱电工程综合布线系统与计算机网络布线系统有何不同?【网络综合布线】...

弱电工程的综合布线是模块化和灵活的建筑物或建筑物之间的信息传输通道。 综合配电系统可以连接到声音设备、数据设备、开关设备和各种控制设备和信息管理系统。 同时&#xff0c;它还使这些设备与外部通信网络连接起来。弱电工程综合布线系统与计算机网络布线系统有何不同..弱…

计算机专硕专业课单科分数线,计算机考研|这两所自划线,单科没过线也能复试?...

原标题&#xff1a;计算机考研|这两所自划线&#xff0c;单科没过线也能复试&#xff1f;东南、浙大&#xff01;单科没过线也能复试&#xff01;关注量子考研公众号&#xff0c;获取最新计算机考研咨询1.东南大学&#xff1a;统考考生(不含报考苏州联合研究生院考生和管理类联…

Saltstack_使用指南17_salt-ssh

1. 主机规划 salt 版本 1 [rootsalt100 ~]# salt --version 2 salt 2018.3.3 (Oxygen) 3 [rootsalt100 ~]# salt-minion --version 4 salt-minion 2018.3.3 (Oxygen) salt ssh文档 https://docs.saltstack.com/en/latest/topics/ssh/index.html 2. salt-ssh实现步骤 2.1. 部署s…

新手入门:AIX操作系统安装图解

AIX&#xff08;Advanced Interactive Executive&#xff09;是IBM 公司的UNIX操作系统&#xff0c;它特别适合于做关键数据处理。2002年IBM发布了AIX 5.2版。 下面就以该版本为例来介绍IBM的AIX操作系统的安装&#xff0c;主要介绍在IBM P630机器上如何使用AIX软件的光盘&…

华为荣耀9x怎么解账户锁_麒麟820,4000万像素,荣耀X10是下一部千元街机?

哈喽黑粉们&#xff0c;欢迎来到黑马公社。最近发布的新机很多&#xff0c;其中之一就是黑马此前和大家聊过多次的荣耀X10。这款新机于昨天5月20日发布&#xff0c;表现怎么样呢&#xff1f;今天黑马就来聊聊这款新机。和此前爆料的一样&#xff0c;荣耀X10采用了升降式设计&am…

关键词提取算法

1、先给本聚类内的所有文档进行分词&#xff0c;然后用一个字典保存每个词出现的次数;2、遍历每个词&#xff0c;得到每个词在所有文档里的IDF值&#xff0c;和在本聚类内出现的次数&#xff08;TF&#xff09;相乘的值;3、用一个字典(key是词&#xff0c;value是TF*IDF权重)来…

JavaWeb的分页

1.什么是分页 第N页/共M页 首页 上一页 1 2 3 4 5 6 7 8 9 下一页 尾页 [ ] go 分页的优点&#xff1a;只查询一页&#xff0c;不用查询所有页&#xff01; 2.分页数据 页面的数据都是由Servlet传递过来的&#xff01; Servlet&#xff1a; 1.*当前页&#xff1a;pageCod…

中反应器体积_缠绕管式反应器大幅提高能效,移热能力较列管式反应器提升逾50%...

武汉东海石化重型装备有限公司与中科院过程工程研究所联合开展的高效缠绕管式反应器研发课题二期研究日前结题。该研究建立了一套与不同工作原理相适应的缠绕管式反应器设计方法&#xff0c;使缠绕管式反应器的移热能力较列管式固定床反应器提升逾50%&#xff0c;可极大提高企业…

【异常(待解决)】org.apache.http.NoHttpResponseException: api.weixin.qq.com:443 failed to respond...

一、记录下异常堆栈信息 2019-06-01 10:26:58.246 [http-nio-9850-exec-3] ERROR weixin.popular.client.LocalHttpClient - execute error org.apache.http.NoHttpResponseException: api.weixin.qq.com:443 failed to respondat org.apache.http.impl.conn.DefaultHttpRespon…

企业内容管理-互联网应用

企业内容管理-互联网应用 当你第一次听到企业内容管理这个名字&#xff0c;很容易联想到ERP这种复杂无比的系统。实际上也确实如此&#xff0c;目前几大主要的ECM系统都是复杂无比&#xff0c;所以我想从互联网应用&#xff0c;一般网民可以使用的角度来谈谈企业内容管理。 从…

计算机做游戏到大学要学什么,大学学什么专业,毕业才能从事电竞行业?

原标题&#xff1a;大学学什么专业&#xff0c;毕业才能从事电竞行业&#xff1f;电竞可不只是打游戏这么简单。想必最近很多同学已经陆陆续续收到录取通知书了&#xff0c;大学的美好生活已经在等着你们啦&#xff01;今天化学姐想和大家聊聊就业已经游戏行业相关的事儿。电子…

layui中table监听单元格_最全总结 | 聊聊 Python 办公自动化之 PPT(中)

点击上方 “AirPython”&#xff0c;选择 “加为星标”第一时间关注 Python 技术干货&#xff01;1. 前言上一篇文章简单地介绍了 PPT 的文档结构&#xff0c;并使用 python-pptx 这个依赖库完成对 PPT 文档最基本的操作最全总结 | 聊聊 Python 办公自动化之 PPT(上)作为 PPT 系…

东北考生到南方学计算机,为啥东北考生都想去南方,而南方学生很少考东北,看看他们怎么说...

原标题&#xff1a;为啥东北考生都想去南方&#xff0c;而南方学生很少考东北&#xff0c;看看他们怎么说文/晓宁说教育高考对于众多考生来说&#xff0c;是人生中最重要的一场考试&#xff0c;如果能在高考中发挥出好成绩&#xff0c;就可以顺利的考上一所自己理想的大学。按照…