如何用单循环+纯数学运算符,仅靠索引i生成重复N次的目标序列?
实现预期数组输出的单循环数学计算方案
问题背景
你希望通过单循环、仅使用数学运算符,完全依靠循环索引i计算值,得到如下预期输出的数组:
// 预期输出 [0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4]
原始尝试的代码如下:
const array = []; const times = 3; const count = 5; for (let i = 0; i < times * count * 2; i++) { const a = i - (i % times); const b = a % count; array.push(b); } console.log(array);
优化实现方案
可以通过更简洁的数学计算直接得到目标值,完全满足你的要求:
const array = []; const times = 3; const count = 5; for (let i = 0; i < times * count * 2; i++) { const value = Math.floor(i / times) % count; array.push(value); } console.log(array);
逻辑解释
Math.floor(i / times):将每times个连续的循环索引i归为同一组,得到一个递增的整数(比如i=0、1、2时结果为0;i=3、4、5时结果为1,以此类推),这一步等价于原始代码中i - (i % times)的核心作用,但直接取商更高效简洁。% count:让上述分组后的整数在0到count-1的范围内循环,实现"每times个重复同一数值,遍历完0到count-1后再从头循环"的效果。
这个实现完全符合你的限制条件:单循环、仅使用数学运算符、所有计算仅依赖循环索引i。
内容的提问来源于stack exchange,提问作者Yusuf Bayrak
相关产品推荐
相关产品推荐

