You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

数组遍历异常及元素比较问题求助

让我来帮你拆解这两个问题的根源,然后一步步修正代码~

问题2:循环忽略原数组、返回索引而非年份的原因

你在测试循环时犯了两个核心错误:

  • 混淆了循环索引和数组元素:你把t处理成年份拆分后的数组,但循环里直接把索引值i存入数组,而不是取原数组arr[i]t[i]对应的年份元素,自然会得到0、2、4这类索引数字,而非实际年份。
  • 重复自增导致循环跳步for循环的条件里已经有i++,你又在push(i++)里再做一次自增,这会让每次循环i直接增加2,既跳过了一半元素,也让索引和元素完全不匹配。

举个例子:第一次循环i=0,push(i++)后i变成1,紧接着for循环的i++让i变成2;第二次循环i=2,push后i变成3,for循环的i++让i变成4;此时i等于数组长度4,进入第三次循环,push(4++)后i变成5,最终得到[0,2,4]

修正后的测试代码

function nextHappyYear(arr){ 
  var o = { happy: [], notHappy: [] }; 
  for (var i = 0; i < arr.length; i++) { 
    if (i%2 === 0) { 
      o.happy.push(arr[i]); // 取原数组对应索引的元素
    } else { 
      o.notHappy.push(arr[i]);
    } 
  } 
  console.log(o.happy) 
  return o;
} 
nextHappyYear([1021, 1022, 1023, 1024]) // 现在返回 [1021, 1023],符合预期

问题1:快乐年判断逻辑错误的原因

同样是两个关键问题:

  • 索引与元素混淆:你在if条件里用i[0]i[1],但i是循环索引(数字类型),不是t数组里拆分后的年份字符数组,应该用t[i]来获取当前年份的拆分结果。
  • 判断逻辑不完整:你只检查了第一个数字和其他三个的重复情况,但没验证第二个与第三、第四个,以及第三个与第四个的重复。比如年份1213,第一个和第三个数字重复,你的逻辑会漏掉这个情况;1233这种最后两位重复的也无法检测。

修正后的快乐年判断函数

推荐用更简洁可靠的方式:把年份转成字符串后用Set去重,若去重后的长度和原字符串长度一致,说明所有数字都不重复。

function nextHappyYear(arr){ 
  var o = { happy: [], notHappy: [] }; 
  for (var i = 0; i < arr.length; i++) { 
    const yearStr = arr[i].toString();
    // Set自动去重,长度相等则无重复数字
    const isHappy = new Set(yearStr).size === yearStr.length;
    if (isHappy) { 
      o.happy.push(arr[i]); 
    } else { 
      o.notHappy.push(arr[i]);
    } 
  } 
  console.log(o);
  return o;
} 
nextHappyYear([1021, 1022, 1023, 1024]) 
// 输出:{ happy: [1023, 1024], notHappy: [1021, 1022] },完全符合预期

如果坚持用逐个判断的方式,需要补全所有两两组合的检查:

function nextHappyYear(arr){ 
  var o = { happy: [], notHappy: [] }; 
  var t = arr.map(e => e.toString().split(""));
  for (var i = 0; i < t.length; i++) { 
    const digits = t[i];
    // 检查所有两两组合是否无重复
    const isHappy = digits[0] !== digits[1] && 
                    digits[0] !== digits[2] && 
                    digits[0] !== digits[3] && 
                    digits[1] !== digits[2] && 
                    digits[1] !== digits[3] && 
                    digits[2] !== digits[3];
    if (isHappy) { 
      o.happy.push(arr[i]); 
    } else { 
      o.notHappy.push(arr[i]);
    } 
  } 
  console.log(o);
  return o;
}

内容的提问来源于stack exchange,提问作者mike87

火山引擎 最新活动