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

新手上路,取出现次数,怎么计算这个速度快呢?大佬们有什么好的建议?

新手上路,取出现次数,怎么计算这个速度快呢?大佬们有什么好的建议?

POPMUISE 2019-09-05 19:53:59
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贡献1831条经验 获得超9个赞

解决方案是先把数据处理成更易读取的对象,避免重复计算
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-05
?
蛊毒传说

TA贡献1895条经验 获得超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-05
  • 2 回答
  • 0 关注
  • 280 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信