You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Codewars点赞/点踩逻辑问题:我的if语句为何无法正常工作?

Codewars点赞点踩挑战的逻辑疑问

挑战规则

  • YouTube的点赞(Like)和点踩(Dislike)按钮不能同时激活
  • 点击已处于激活状态的按钮,会取消该操作(回到无状态)
  • 点击与当前状态相反的按钮,会覆盖之前的状态
  • 无激活状态或操作列表为空时,返回Nothing

示例:

  • likeOrDislike(['Dislike']) => Dislike
  • likeOrDislike(['Like', 'Like']) => Nothing
  • likeOrDislike(['Dislike', 'Like']) => Like
  • likeOrDislike(['Like', 'Dislike', 'Dislike']) => Nothing

我的实现代码

function likeOrDislike(buttons) {
  let answer = 'Nothing';

  for (let i = 0; i < buttons.length; i++) {
    if (buttons[i] !== 'Nothing') {
      answer = buttons[i];
    }
  }

  return answer;
}

正确参考代码

function likeOrDislike(buttons) {
  let state = 'Nothing';

  for (let i = 0; i < buttons.length; i++) {
    if (buttons[i] === state) {
      state = 'Nothing';
    } else {
      state = buttons[i];
    }
  }

  return state;
}

疑问与解析

我的疑问

为什么正确代码需要在循环里把state重置为Nothing?我原以为只要判断操作不是Nothing就直接赋值,其他情况保留初始的Nothing就行,搞不懂自己的逻辑错在哪。

逻辑错误拆解

你的代码只实现了「最后一次有效操作覆盖结果」,完全忽略了挑战里重复点击已激活按钮要取消状态的核心规则:

  1. 比如操作列表是['Like', 'Like'],你的代码会两次把answer设为Like,最终返回Like,但正确结果应该是Nothing——因为重复点击Like按钮会取消点赞状态。
  2. 正确代码的逻辑才完全贴合规则:
    • 当当前点击的按钮和当前状态相同时(比如当前是Dislike,又点Dislike),把状态重置为Nothing,模拟「取消操作」
    • 当当前点击的按钮和状态不同时(不管是从Nothing切换到Like/Dislike,还是从Like切换到Dislike),直接把状态更新为点击的按钮,模拟「激活/覆盖状态」

拿示例['Like', 'Dislike', 'Dislike']走一遍流程:

  1. 初始状态Nothing,第一次点击Like:状态不同,更新为Like
  2. 第二次点击Dislike:和当前Like不同,更新为Dislike
  3. 第三次点击Dislike:和当前状态一致,重置为Nothing
    最终返回Nothing,完全符合要求。

而你的代码会直接取最后一个操作Dislike返回,显然不符合规则。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 17:30:26