JavaScript实现一个函数,找出数组中重复出现次数最多的元素。

JavaScript实现一个函数,找出数组中重复出现次数最多的元素。

实现思路

要找出数组里重复出现次数最多的元素,咱们可以这么干:

  1. 先弄个“小账本”(也就是一个对象),用来记录数组里每个元素出现的次数。
  2. 接着遍历数组,把每个元素都在“小账本”里记一笔,如果这个元素之前没出现过,就记它出现了 1 次;要是之前出现过,就把它出现的次数加 1。
  3. 最后在“小账本”里找出出现次数最多的元素。

代码实现

function findMostFrequentElement(arr) {// 第一步:创建一个空对象,当作“小账本”let countObj = {};// 第二步:遍历数组,记录每个元素出现的次数for (let i = 0; i < arr.length; i++) {let element = arr[i];if (countObj[element]) {// 如果元素已经在“小账本”里,就把它的出现次数加 1countObj[element]++;} else {// 如果元素不在“小账本”里,就记它出现了 1 次countObj[element] = 1;}}// 第三步:找出出现次数最多的元素let mostFrequentElement;let maxCount = 0;// 遍历“小账本”for (let element in countObj) {if (countObj[element] > maxCount) {// 如果当前元素的出现次数比之前记录的最大次数还多// 就更新最大次数和出现次数最多的元素maxCount = countObj[element];mostFrequentElement = element;}}return mostFrequentElement;
}// 测试函数
let array = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4];
let result = findMostFrequentElement(array);
console.log("数组中重复出现次数最多的元素是: " + result);

代码解释

  1. 创建“小账本”

    • let countObj = {};:创建了一个空对象 countObj,用来记录数组里每个元素出现的次数。
  2. 遍历数组记录元素出现次数

    • for (let i = 0; i < arr.length; i++):使用 for 循环遍历数组里的每个元素。
    • if (countObj[element]):检查当前元素是否已经在“小账本”里。如果在,就把它的出现次数加 1;如果不在,就记它出现了 1 次。
  3. 找出出现次数最多的元素

    • let mostFrequentElement;let maxCount = 0;:分别用来记录出现次数最多的元素和最大的出现次数,初始时最大次数设为 0。
    • for (let element in countObj):遍历“小账本”里的每个元素。
    • if (countObj[element] > maxCount):如果当前元素的出现次数比之前记录的最大次数还多,就更新最大次数和出现次数最多的元素。
  4. 返回结果

    • return mostFrequentElement;:最后返回出现次数最多的元素。

通过以上步骤,我们就实现了一个能找出数组中重复出现次数最多元素的函数。

找出数组中出现次数最多的前 N 个元素

为了找出数组中出现次数最多的前 N 个元素,可以按照以下思路实现:

  1. 统计元素出现次数:使用一个对象来记录数组中每个元素出现的次数。
  2. 将统计结果转换为数组:将对象中的键值对转换为数组,方便后续排序。
  3. 对数组进行排序:根据元素出现的次数对数组进行降序排序。
  4. 提取前 N 个元素:从排序后的数组中提取前 N 个元素。

以下是实现该功能的 JavaScript 代码:

function topNMostFrequent(arr, N) {// 统计每个元素出现的次数const countMap = {};for (const element of arr) {if (countMap[element]) {countMap[element]++;} else {countMap[element] = 1;}}// 将统计结果转换为数组const countArray = [];for (const [element, count] of Object.entries(countMap)) {countArray.push({ element, count });}// 对数组进行排序countArray.sort((a, b) => b.count - a.count);// 提取前 N 个元素const topN = countArray.slice(0, N).map(item => item.element);return topN;
}// 示例用法
const array = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4];
const N = 2;
const result = topNMostFrequent(array, N);
console.log(`数组中出现次数最多的前 ${N} 个元素是:`, result);

代码解释:

  1. 统计元素出现次数

    • 使用 countMap 对象来记录每个元素出现的次数。遍历数组 arr,如果元素已经在 countMap 中,则将其计数加 1;否则,将其计数初始化为 1。
  2. 将统计结果转换为数组

    • 使用 Object.entries(countMap)countMap 对象的键值对转换为数组。
    • 遍历该数组,将每个键值对转换为一个包含 elementcount 属性的对象,并将其添加到 countArray 中。
  3. 对数组进行排序

    • 使用 sort 方法对 countArray 进行降序排序,排序依据是元素的出现次数。
  4. 提取前 N 个元素

    • 使用 slice(0, N) 方法从排序后的 countArray 中提取前 N 个元素。
    • 使用 map 方法将这些元素的 element 属性提取出来,形成一个新的数组。

复杂度分析:

  • 时间复杂度 O ( n l o g n ) O(n log n) O(nlogn),其中 n n n 是数组的长度。主要的时间开销在于排序操作。
  • 空间复杂度 O ( k ) O(k) O(k),其中 k k k 是数组中不同元素的数量。主要的空间开销在于存储元素的计数信息。

找出数组中所有出现次数最多的元素

实现思路

  1. 统计元素出现次数:遍历数组,使用一个对象来记录每个元素出现的次数。
  2. 找出最大出现次数:遍历记录次数的对象,找出其中的最大出现次数。
  3. 筛选出出现次数最多的元素:再次遍历记录次数的对象,将出现次数等于最大出现次数的元素筛选出来。

代码示例

function findMostFrequentElements(arr) {// 步骤 1:统计元素出现次数const countMap = {};for (let i = 0; i < arr.length; i++) {const element = arr[i];if (countMap[element]) {countMap[element]++;} else {countMap[element] = 1;}}// 步骤 2:找出最大出现次数let maxCount = 0;for (const element in countMap) {if (countMap[element] > maxCount) {maxCount = countMap[element];}}// 步骤 3:筛选出出现次数最多的元素const mostFrequentElements = [];for (const element in countMap) {if (countMap[element] === maxCount) {mostFrequentElements.push(element);}}return mostFrequentElements;
}// 测试数组
const array = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5];
const result = findMostFrequentElements(array);
console.log("所有出现次数最多的元素是: ", result);

代码解释

  1. 统计元素出现次数

    • 定义一个空对象 countMap 用于记录每个元素的出现次数。
    • 遍历数组 arr,对于每个元素,如果它已经在 countMap 中,就将其对应的值加 1;如果不在,就将其添加到 countMap 中并将值初始化为 1。
  2. 找出最大出现次数

    • 定义变量 maxCount 并初始化为 0。
    • 遍历 countMap 对象,将其中的最大值赋给 maxCount
  3. 筛选出出现次数最多的元素

    • 定义一个空数组 mostFrequentElements 用于存储出现次数最多的元素。
    • 再次遍历 countMap 对象,将出现次数等于 maxCount 的元素添加到 mostFrequentElements 数组中。
  4. 返回结果:最后返回 mostFrequentElements 数组。

复杂度分析

  • 时间复杂度 O ( n ) O(n) O(n),其中 n n n 是数组的长度。因为需要遍历数组一次来统计元素出现次数,再遍历记录次数的对象两次,总的时间复杂度是线性的。
  • 空间复杂度 O ( k ) O(k) O(k),其中 k k k 是数组中不同元素的数量。主要的空间开销在于存储元素的出现次数。

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

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

相关文章

10. 九转金丹炼矩阵 - 矩阵置零(标记优化)

哪吒在数据修仙界中继续他的修炼之旅。这一次,他来到了一片神秘的金丹谷,谷中有一座巨大的九转金丹炉,炉身闪烁着神秘的光芒。金丹炉的入口处有一块巨大的石碑,上面刻着一行文字:“欲破此炉,需以九转金丹之力,炼矩阵之零,标记优化定乾坤。” 哪吒定睛一看,石碑上还有…

PostgreSQL vs MongoDB:优劣分析及适用场景

PostgreSQL vs MongoDB&#xff1a;优劣分析及适用场景 PostgreSQL 和 MongoDB 是两种非常不同的数据库系统&#xff0c;它们各自具有独特的优势和适用场景。以下是对这两种数据库的优劣分析及适用场景&#xff1a; PostgreSQL 优势&#xff1a; ACID 兼容性&#xff1a;Po…

出行项目案例

spark和kafka主要通过Scala实现&#xff0c;Hadoop和HBase主要基于java实现。 通过该项目&#xff0c;主要达到以下目的&#xff1a; &#xff08;1&#xff09;通用的数据处理流程&#xff0c;入门大数据领域 &#xff08;2&#xff09;真实体验大数据开发工程师的工作 &a…

PyEcharts 数据可视化:从入门到实战

一、PyEcharts 简介 PyEcharts 是基于百度开源可视化库 ECharts 的 Python 数据可视化工具&#xff0c;支持生成交互式的 HTML 格式图表。相较于 Matplotlib 等静态图表库&#xff0c;PyEcharts 具有以下优势&#xff1a; 丰富的图表类型&#xff08;30&#xff09;动态交互功…

五、Three.js顶点UV坐标、纹理贴图

一部分来自1. 创建纹理贴图 | Three.js中文网 &#xff0c;一部分是自己的总结。 一、创建纹理贴图 注意&#xff1a;把一张图片贴在模型上就是纹理贴图 1、纹理加载器TextureLoader 注意&#xff1a;将图片加载到加载器中 通过纹理贴图加载器TextureLoader的load()方法加…

使用postman测试api接口基本步骤

测试一个已写好的 API 接口需要系统性地验证其功能、性能、安全性及异常处理能力。以下是使用 Postman 进行 API 接口测试的详细步骤和注意事项&#xff1a; 1. 确认接口文档 明确输入输出&#xff1a;了解接口的请求方法&#xff08;GET/POST/PUT/DELETE&#xff09;、URL、请…

綫性與非綫性泛函分析與應用_1.例題(下)-半母本

第1章 實分析與函數論:快速回顧(下) 五、基數;有限集和無限集相關例題 例題1:集合基數的判斷 判斷集合和集合B=\{a,b,c,d,e\}的基數關係。 解析: 可以構造一個雙射,例如,,,,。 所以,兩個集合具有相同的基數。 例題2:可數集的證明 證明整數集是可數集。 解析: …

Windows系统第一次运行C语言程序,环境配置,软件安装等遇到的坑及解决方法

明确需要编辑器和编译器&#xff0c;并选择自己要用什么&#xff08;我选的编辑器是VSCode&#xff1a;Visual Studio Code&#xff1b;编译器是gcc&#xff09;下载VSCode并配置环境变量&#xff08;这里没啥问题&#xff09;&#xff0c;安装C/C的拓展安装Cygwin&#xff0c;…

浅拷贝和深拷贝的区别?可以举例说明

在编程中&#xff0c;浅拷贝和深拷贝是用于复制对象的两种不同方式&#xff0c;它们的主要区别在于复制对象时对对象内部成员的处理方式。今天我们对此进行讨论。 目录 1 浅拷贝 2 深拷贝 1 浅拷贝 浅拷贝创建一个新对象&#xff0c;新对象的属性值会复制原始对象的属性值…

微信小程序实现拉卡拉支付

功能需求&#xff1a;拉卡拉支付&#xff08;通过跳转拉卡拉平台进行支付&#xff09;&#xff0c;他人支付&#xff08;通过链接进行平台跳转支付&#xff09; 1.支付操作 //支付 const onCanStartPay async (obj) > {uni.showLoading({mask: true})// 支付接口获取需要传…

使用ESP-IDF来驱动INMP441全向麦克风

之前的文章我们讲过了I2S。 I2S是什么通信协议&#xff1f;它如何传输音频数据&#xff1f;它和I2C是什么关系&#xff1f;_i2c接口和i2s-CSDN博客文章浏览阅读836次&#xff0c;点赞12次&#xff0c;收藏14次。这个可以参考ADC来理解&#xff0c;我们的ADC也是有左对齐和右对…

MobaXterm_Portable_v23.2 免费下载与使用教程(附安卓替代方案)

一、MobaXterm_Portable 简介 MobaXterm 是一款功能强大的全能终端工具&#xff0c;支持 SSH、SFTP、RDP、VNC、X11 转发 等多种协议&#xff0c;集成了终端、文件传输、远程桌面等功能。其便携版&#xff08;Portable Edition&#xff09;无需安装&#xff0c;解压即可使用&a…

【带你 langchain 双排系列教程】6.LangChain多模态输入与自定义输出实战指南

一、为什么需要多模态交互&#xff1f; 在真实业务场景中&#xff0c;数据从来都不是单一形式的。想象一个智能客服系统需要同时分析用户的文字描述、上传的产品图片和语音留言&#xff0c;或者一个内容审核系统需要检查文本、图像和视频的组合内容。传统单一模态的处理方式已…

【Bluedroid】AVRCP 连接源码分析(三)

接着上一篇【Bluedroid】AVRCP 连接源码分析&#xff08;一&#xff09;-CSDN博客&#xff0c;继续AVRCP连接的源码分析。 AVRC_OpenBrowse /packages/modules/Bluetooth/system/stack/avrc/avrc_api.cc /*****************************************************************…

基于大语言模型的推荐系统(1)

推荐系统&#xff08;recommendation system&#xff09;非常重要。事实上&#xff0c;搜索引擎&#xff0c;电子商务&#xff0c;视频&#xff0c;音乐平台&#xff0c;社交网络等等&#xff0c;几乎所有互联网应用的核心就是向用户推荐内容&#xff0c;商品&#xff0c;电影&…

高性能GPU计算:释放计算潜力的加速利器

高性能GPU计算:释放计算潜力的加速利器 大家好,我是Echo_Wish,今天我们来聊一聊 高性能GPU计算。近年来,随着人工智能、深度学习、科学计算等领域的快速发展,GPU(图形处理单元)作为计算加速的核心技术,逐渐成为数据处理的“核心大脑”。尤其是在深度学习模型训练和大规…

QT闲记-状态栏,模态对话框,非模态对话框

1、创建状态栏 跟菜单栏一样,如果是继承于QMainWindow类,那么可以获取窗口的状态栏,否则就要创建一个状态栏。通过statusBar()获取窗口的状态栏。 2、添加组件 通常添加Label 来显示相关信息,当然也可以添加其他的组件。通过addWidget()添加组件 3、设置状态栏样式 …

SHELL32!SHLoadPopupMenu函数分析之添加属性菜单项

SHELL32!SHLoadPopupMenu函数分析之添加属性菜单项 第一部分&#xff1a; // // user does not support pop-up only menu. // STDAPI_(HMENU) SHLoadPopupMenu(HINSTANCE hinst, UINT id) { HMENU hmenuParent LoadMenu(hinst, MAKEINTRESOURCE(id)); if (hmenuPare…

将RocketMQ集成到了Spring Boot项目中,实现站内信功能

1. 添加依赖 首先,在pom.xml中添加RocketMQ的依赖: <dependencies><!-- Spring Boot Starter Web --><dependency><groupId>org.springframework.boot

C语言基础要素:安装 Visual Studio 2022

安装 Visual Studio 2022 Visual Studio 是由微软开发的一款集成开发环境&#xff08;IDE&#xff09;&#xff0c;支持多种编程语言和开发平台。它提供了丰富的工具和功能&#xff0c;帮助开发者高效地编写、调试和部署应用程序。无论是桌面应用、Web 应用还是移动应用&#…