求教一个循环算法

入口图标需要可根据开服天数进行循环,但是打开的界面不变,例如开服第3天开启图标,每隔6天进行一次循环,一个循环序列中有4个图标。则第3-9天显示图标1;第10-16天显示图标2;第17-23天显示图标3;第24-30天显示图标4;第31-37是图标1
所以我写了一下的方法

// 现在是第几天openday ,开始天数start,间隔loop,最大循环数num
function showIcon(openday,start,loop,num) {
    let index =  Math.floor((openday - start ) / (loop + 1)) % num;
    return index
}

重点来了 ,给你一个数组[1,2,999,999]
1代表图标1出现1次
2代表图标2出现2次
999代表图标3出现999次
999代表图标4出现999次
所以现在是 0 1 2 3 1 2 3 2 3 2 3 2 3这样循环下去
现在我应该怎么写新的方法啊~~~

阅读 2.1k
3 个回答
const array = [1, 2, 4, 6];
let loop = true; // 用于判断数组是否仍有正整数
for (let i = 0; i < array.length; i++) {
  loop = false; // 默认数组里没有正整数
  // 判断当前图标是否能显示
  if (array[i]) {
    console.log(i);
    loop = true;
    array[i]--; // 当前图标显示天数减一
  }
  // 这次循环只要有图标显示则重新循环
  if (i === array.length - 1 && loop) i = 0;
}

这样看上去是没问题吧,可以拿到最后应该有的串。先说说优化点,可以实现一个合理的repeat函数。我偷懒就用了字符串的。

感觉这种不是很好。应该求出最大轮数,然后判断有没有超过数组中的最小数,超过了就把他们移除,然后移除天数,再重复上述操作,知道在数组拿到index

clipboard.png

分割线,更新 2019年5月10日18:16:16

var arr= [0,1,2,3]
var _sortArr = [4,2,1,100].map((v,i)=>({v:v,i:i})).sort((n,m)=>n.v-m.v);
var _sum = 0;
var _arr = [];
while(_sortArr.length){
    var item = _sortArr.shift();
    _arr = _arr.concat(arr.join('').repeat(item.v-_sum));
    _sum=item.v;
    arr.splice(item.i,1);
}
console.log(_arr)

clipboard.png

写了好久,有点头绪,我把我的方法说出来大家看看还有什么建议。
麻烦的是需要建一个数据用来存储数据对应天数的图标序号。
有没有什么更好的方法虚心请教。
先把我的贴出来吧
图片描述

图片描述

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题