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;}
蛊毒传说
TA贡献1895条经验 获得超3个赞
你能先说清楚你到底在求什么吗?你这个for里面的计算结果是累加还是干嘛?如果是:letcount=0for(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=0for(i=0;i<500;i++){letcount=cache+(arr[i].split("")[pos-1]===target?1:0)//仅在循环内使用countcache=count}
添加回答
举报
0/150
提交
取消