JavaScript 数组算法实战:众数查找、绝对值统计与最大子序列和

作者:函数茶馆

时间:2026-10-22

浏览:657

本文通过三个JavaScript数组处理实例,演示了常见算法题的解题思路。首先介绍如何统计元素频率并找出出现次数超过数组长度一半的元素及其索引;其次讲解如何处理包含正负数的数组,通过绝对值统计各数值出现频率;最后探讨最大子序列和问题,通过暴力枚举法计算连续子序列的最大和,并指出全负数情况下的潜在逻辑缺陷。

文章目录
 

查找高频元素及其索引

给定一个数组,例如 [5,3,4,3,0,3,3],需要找出其中出现频率最高的元素。判定条件是该元素的频率除以数组长度必须大于 0.5。如果存在满足条件的元素,则输出其所有出现的下标;若不存在,则返回 -1。


定义测试数组:var a = [5,3,4,6,3,3,3]


初始化循环变量 i 为 0,当前元素 ci,以及用于存储统计结果的对象 r 为空对象。遍历数组:for(var i=0,ci,r={};ci=a[i];i++){


检查对象 r 中是否已存在键为当前元素 ci 的属性:if(r[ci]){


若已存在,将当前索引 i 追加到该元素对应的索引数组中:r[ci].idx.push(i);


将该元素的出现计数加 1:r[ci].count++;


否则(若该元素首次出现):}else{


在对象 r 中初始化该元素的信息,包括包含当前索引 i 的数组 idx 和初始计数 count 为 1:r[ci]={idx:[i],count:1}


        }   
    }   

初始化结果变量 f 为 -1,获取数组长度 l:var f = -1,l=a.length;


遍历统计对象 r 中的所有键:for(var p in r){


判断该元素的出现次数除以数组长度是否大于 0.5,若是,则将结果 f 更新为该元素对应的索引数组:if(r[p].count/l>0.5)f=r[p].idx;


    }   

弹出结果 f:alert(f);


统计绝对值频率

现有数组 [5,0,-5,2,-4,5],要求将正数和负数视为同一个数值(即统计绝对值),并计算每个数值出现的频率。


定义测试数组:var a = [5,3,4,6,-3,3,-3]


初始化循环变量 i 为 0,当前元素 ci,以及统计对象 r 为空对象。遍历数组:for(var i=0,ci,r={};ci=a[i++];){


检查对象 r 中是否已存在键为当前元素绝对值的属性:if(r[Math.abs(ci)]){


若已存在,将该键对应的计数值加 1:r[Math.abs(ci)]++


否则(若该绝对值首次出现):}else{


在对象 r 中初始化该绝对值对应的计数为 1:r[Math.abs(ci)]=1;


        }   
    }      

初始化结果数组 s 为空数组:var s =[];


遍历统计对象 r 中的所有键:for(var p in r){


将每个键对应的频率值推入结果数组 s 中:s.push(r[p]);


    }   

弹出结果数组 s:alert(s);


最大子序列和问题

给定序列 [5,0,2,-6,4],其子序列可以是 [5,0], [5,0,2], [2,-6], [5,0,2,-6,4] 等,但不能是 [5,2] 或 [5,-6](即子序列元素在原序列中必须连续)。


目标是求出最大的子序列和。例如在上述例子中,最大子序列为 [5,0,2],其和为 7。


定义测试数组 a = [-6,0,2,5,4],初始化最大和 max 为 0:var a = [-6,0,2,5,4],max = 0;


外层循环遍历起始索引 i,从 0 到 l-1:for(var i=0,l=a.length;i<l-1;i++){


内层循环遍历结束索引 j,从 i 到 l:for(var j=i;j<l;j++){


初始化临时变量 tmp 为 0,内层循环 k 从 i 到 j:for(var tmp=0,k=i;k<=j;k++){


将当前元素 a[k] 累加到 tmp:tmp = tmp +a[k];


            }   

如果 tmp 大于 max,则更新 max 为 tmp:if(tmp>max) max = tmp;


        }   
    }   

弹出最大和 max:alert(max);


winter 回复


第一题



[Ctrl+A 全选 注:引入外部Js需再刷新一下页面才能执行]


第二题 如果不考虑JS方便的Object的话......



[Ctrl+A 全选 注:引入外部Js需再刷新一下页面才能执行]


第三个全负数的bug



[Ctrl+A 全选 注:引入外部Js需再刷新一下页面才能执行]

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章