如何在Ruby中通过多条件修改数组(FizzBuzz场景)
Ruby多条件数组替换(FizzBuzz实现)
先给出符合需求的实现代码:
def fizz_buzz(numbers_arr) numbers_arr.map do |number| if number % 15 == 0 'fizzBuzz' elsif number % 3 == 0 'fizz' elsif number % 5 == 0 'buzz' else 'bug!' end end end
你的尝试未成功的原因
条件判断顺序错误
你先判断3的倍数再判断5的倍数,导致同时是3和5倍数的数(比如15)会被先设为fizz,随后又被覆盖成buzz,永远无法得到fizzBuzz。必须优先判断15的倍数(3和5的最小公倍数)。逻辑表达式错误
你写的number != 'fuzz' || 'buzz'存在两个问题:- 拼写错误:
fuzz应为fizz; - 逻辑错误:
|| 'buzz'中'buzz'是真值,导致该条件永远成立,所有元素都会被设为bug!。实际上不需要额外判断,用else兜底即可。
- 拼写错误:
方法使用错误
each:遍历数组但不会修改原数组,块内的number是局部变量,修改它对原数组无影响;filter_map:会过滤掉块返回nil的元素,你的块内无返回值,最终会得到空数组,不适合需要保留所有元素的场景;- 最后一行的
select + map:仅处理3的倍数,其余元素被丢弃,返回数组长度与输入不一致,不符合测试用例要求。
代码逻辑说明
- 用
map遍历数组,每个元素根据条件返回对应值,最终生成新的结果数组; - 优先判断
number % 15 == 0(同时是3和5的倍数),返回fizzBuzz; - 依次判断是否为3的倍数、5的倍数,分别返回
fizz、buzz; - 剩余情况用
else兜底,返回bug!。
内容的提问来源于stack exchange,提问作者Clever Júnior
相关产品推荐
相关产品推荐

