为何`count === 0 && (index = 0)`与`count === 0, index = 0;`逻辑有差异?
跳跃云重制版:逻辑问题解析与索引循环实现
一、逗号运算符与逻辑与(&&)的核心差异
你原来写的count === 0, index = 0;是逗号运算符的用法,而修改后的count === 0 && (index = 0)是利用了逻辑与的短路特性,两者行为完全不同:
逗号运算符的行为:
- 逗号运算符会依次执行左右两个表达式,不管左边表达式结果是true还是false,右边表达式一定会执行。
- 在原代码中,每次进入while循环都会强制把
index重置为0,导致每次跳转都从云0出发,永远固定跳到(0 + k) % n的位置,无法正常遍历后续云,最终要么无限循环,要么得到错误的能量值。
逻辑与(
&&)的短路特性:- 逻辑与运算中,只有左边表达式结果为
true时,才会执行右边表达式;如果左边为false,右边表达式会直接跳过(短路)。 - 这里只有第一次循环时
count === 0为true,才会初始化index为0;后续循环count大于0,左边条件不成立,就不会再重置index,这样index能保留上一次跳转后的位置,继续计算下一个目标云,直到跳回云0结束循环。
- 逻辑与运算中,只有左边表达式结果为
二、索引循环跳转的正确实现思路
你提到用for循环无法实现回到数组起始位置的逻辑,本质是没抓住“循环直到回到云0”的终止条件,这里提供三种可靠实现方式:
方式1:修正后的while循环
let c = [1,1,1,0,1,1,0,0,0,0]; let e = 100; let k = 3; let n = c.length; const jumpingOnClouds = () => { let count = 0; let index; // 循环条件:第一次必须执行(count===0),之后直到跳回云0 while (count === 0 || index !== 0) { // 仅第一次循环初始化index为0 count === 0 && (index = 0); // 计算下一个跳转的云索引 index = (index + k) % n; // 扣除对应能量 e = c[index] > 0 ? e - 3 : e - 1; count++; } return e; }; console.log(jumpingOnClouds());
方式2:更直观的do-while循环
do-while天然适合“至少执行一次,直到满足终止条件”的场景:
let c = [1,1,1,0,1,1,0,0,0,0]; let e = 100; let k = 3; let n = c.length; const jumpingOnClouds = () => { let currentIndex = 0; do { // 跳转到下一个云 currentIndex = (currentIndex + k) % n; // 根据云类型扣能量 e -= c[currentIndex] ? 3 : 1; // 直到跳回云0时结束循环 } while (currentIndex !== 0); return e; }; console.log(jumpingOnClouds());
方式3:for循环实现思路
如果一定要用for循环,可以先计算需要跳转的总次数(总次数等于数组长度除以k和数组长度的最大公约数):
let c = [1,1,1,0,1,1,0,0,0,0]; let e = 100; let k = 3; let n = c.length; // 计算最大公约数 const gcd = (a, b) => b === 0 ? a : gcd(b, a % b); const totalJumps = n / gcd(n, k); const jumpingOnClouds = () => { let currentIndex = 0; for (let i = 0; i < totalJumps; i++) { currentIndex = (currentIndex + k) % n; e -= c[currentIndex] ? 3 : 1; } return e; }; console.log(jumpingOnClouds());
内容的提问来源于stack exchange,提问作者Andrew Klapper
相关产品推荐
相关产品推荐

