Codewars点赞/点踩逻辑问题:我的if语句为何无法正常工作?
Codewars点赞点踩挑战的逻辑疑问
挑战规则
- YouTube的点赞(Like)和点踩(Dislike)按钮不能同时激活
- 点击已处于激活状态的按钮,会取消该操作(回到无状态)
- 点击与当前状态相反的按钮,会覆盖之前的状态
- 无激活状态或操作列表为空时,返回
Nothing
示例:
likeOrDislike(['Dislike'])=>DislikelikeOrDislike(['Like', 'Like'])=>NothinglikeOrDislike(['Dislike', 'Like'])=>LikelikeOrDislike(['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就行,搞不懂自己的逻辑错在哪。
逻辑错误拆解
你的代码只实现了「最后一次有效操作覆盖结果」,完全忽略了挑战里重复点击已激活按钮要取消状态的核心规则:
- 比如操作列表是
['Like', 'Like'],你的代码会两次把answer设为Like,最终返回Like,但正确结果应该是Nothing——因为重复点击Like按钮会取消点赞状态。 - 正确代码的逻辑才完全贴合规则:
- 当当前点击的按钮和当前状态相同时(比如当前是Dislike,又点Dislike),把状态重置为
Nothing,模拟「取消操作」 - 当当前点击的按钮和状态不同时(不管是从Nothing切换到Like/Dislike,还是从Like切换到Dislike),直接把状态更新为点击的按钮,模拟「激活/覆盖状态」
- 当当前点击的按钮和当前状态相同时(比如当前是Dislike,又点Dislike),把状态重置为
拿示例['Like', 'Dislike', 'Dislike']走一遍流程:
- 初始状态
Nothing,第一次点击Like:状态不同,更新为Like - 第二次点击
Dislike:和当前Like不同,更新为Dislike - 第三次点击
Dislike:和当前状态一致,重置为Nothing
最终返回Nothing,完全符合要求。
而你的代码会直接取最后一个操作Dislike返回,显然不符合规则。
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

