为了账号安全,请及时绑定邮箱和手机立即绑定

求大佬指点哈!取出现次数,怎么计算这个速度快呢?十分感谢

求大佬指点哈!取出现次数,怎么计算这个速度快呢?十分感谢

慕少森 2019-09-19 21:57:39
letarr=['841','458','232','101','676',...]//500个成员的数组,内容都是随机三位数字//想写这样的一个函数,指定数量,指定位置,指定字符,//计算以上数组,在指定数量的成员里,指定字符在指定位置的出现次数functioncalcNum(数量,位置,字符){...}//前4个成员里,第二个位置是'3'的,有几个calcNum(4,2,'3')->1//前3个成员里,第三个位置是'1'的,有几个calcNum(3,3,'1')->1//前5个成员里,第三个位置是'1'的,有几个calcNum(5,3,'1')->2这样单个的计算,速度还行,但是这样就很慢了...for(i=1;i
查看完整描述

2 回答

?
动漫人物

TA贡献1815条经验 获得超10个赞

解决方案是先把数据处理成更易读取的对象,避免重复计算
letarr=['841','458','232','101','676'];
letdata=arr.reduce((d,str,index)=>{
str.split('').forEach((v,i)=>{
i+=1;
if(!d[i])d[i]={};
if(!d[i][v])d[i][v]=[];
d[i][v].push(index);
});
returnd;
},{});
functioncalcNum(start,i,v){
constary=data[i]&&data[i][v]?data[i][v]:[];
if(ary.length){
constindex=ary.findIndex(_i=>_i>=start);
returnary.length-(index>-1?index:0);
}
return0;
}
                            
查看完整回答
反对 回复 2019-09-19
?
繁星点点滴滴

TA贡献1803条经验 获得超3个赞

你能先说清楚你到底在求什么吗?
你这个for里面的计算结果是累加还是干嘛?
如果是:
letcount=0
for(i=1;i<=500;i++){
count+=calcNum(i,3,'1')
}
//count
那么等价于
*pos:位置,target:字符
count=arr.reduce((p,c)=>p=p*2+(c.split("")[pos-1]===target?1:0),0)
如果是:
for(i=1;i<=500;i++){
letcount=calcNum(i,3,'1')
//仅在循环内使用count
}
那么如评论所说可以用缓存:
letcache=0
for(i=0;i<500;i++){
letcount=cache+(arr[i].split("")[pos-1]===target?1:0)
//仅在循环内使用count
cache=count
}
                            
查看完整回答
反对 回复 2019-09-19
  • 2 回答
  • 0 关注
  • 269 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号