我有一个方法返回找出哪个给定数字在均匀度上与其他数字不同并返回它的索引(+1)。
def iq_test(numbers)
new_array = numbers.split(" ").collect {|n| n.to_i}
x = new_array.select(&:even?)
y = new_array.select(&:odd?)
if x.count > y.count
new_array.split.each_with_index do |value, index|
"#{index + 1}".to_i if value % 3 != 0
else y.count > x.count
"#{index + 1}".to_i if value % 2 == 0
end
end
end
例如iq_test("2 4 7 8 10")
应该返回3
。
但是,我正在接收
语法错误,意外的keyword_else,期待keyword_end
我无法找到关闭某些代码的地方。
答案 0 :(得分:5)
这将是部分代码审查和答案。让我们从第一部分开始:
new_array = numbers.split(" ").collect {|n| n.to_i}
x = new_array.select(&:even?)
y = new_array.select(&:odd?)
x
和y
真的是evens
和odds
,不是吗?那些变量名称会更好。split
会在空白处拆分,因此(" ")
是不必要的。partition
。map
,而只在执行从对象数组中提取属性时使用collect
。 (换句话说,我经常使用map
。)(&:to_i)
是{|n| n.to_i}
考虑到上述情况,改写后,这部分可能如下所示:
numbers = input.split.map(&:to_i)
evens, odds = numbers.partition(&:even?)
现在让我们看看其余部分:
if x.count > y.count
new_array.split.each_with_index do |value, index|
"#{index + 1}".to_i if value % 3 != 0
else y.count > x.count
"#{index + 1}".to_i if value % 2 == 0
end
end
让我们考虑一下您收到的错误消息:意外关键字else
;预期end
。这包含了回答问题所需要知道的所有内容(如果您考虑这些问题,您会发现大多数错误消息都会发生)。它说它找到了一个else
,它预计会end
。这正是问题所在,您需要在end
之前放置else
来关闭do / end块。此外,您的else
部分缺少迭代逻辑。
其他说明:
end
不符合他们的结局。正确的对齐可以帮助捕获这些类型的错误。使用像Rubymine这样的IDE或者支持Ruby的复杂文本编辑器也可以提供帮助。else
条款是独立的,您不会在它们之后添加条件。也许你的意思是elsif
正如霍尔格评论的那样。"#{}"
)将表达式转换为字符串。在这里,您将index + 1
转换为字符串,然后返回到.to_i
的整数,将其取消,可以这么说。只需index + 1
即可。Array#index
可用于确定值的索引。以下是考虑上述情况的版本:
if evens.count > odds.count
odds.map{|n| numbers.index(n) + 1}
elsif odds.count > evens.count
evens.map{|n| numbers.index(n) + 1}
end
如果你喜欢这种事,请将你的工作代码带到http://codereview.stackexchange.com/!
答案 1 :(得分:1)
此特定错误是因为您的Help -> Eclipse Marketplace...
阻止没有结束end
。要修复此错误,您需要:
each_with_index
答案 2 :(得分:0)
<强>代码强>
def odd_one_out(str)
evens, odds = str.split.partition { |s| s.to_i.even? }
case [evens.size <=> 1, odds.size <=> 1]
when [0, 1] then evens.first
when [1, 0] then odds.first
else nil
end
end
<强>实施例强>
odd_one_out "0 3 4 6" #=> "3"
odd_one_out "1 5 7 8" #=> "8"
odd_one_out "0 2 4 6" #=> nil
odd_one_out "1 5 7 9" #=> nil
odd_one_out "0 2 3 5" #=> nil
odd_one_out "3" #=> nil
odd_one_out "8" #=> nil
odd_one_out "" #=> nil
<强>解释强>
请参阅Integer#<=>。
假设
str = "0 3 4 6"
然后
a = str.split
#=> ["0", "3", "4", "6"]
evens, odds = a.partition { |s| s.to_i.even? }
#=> [["0", "4", "6"], ["3"]]
evens
#=> ["0", "4", "6"]
odds
#=> ["3"]
b = [evens.size <=> 1, odds.size <=> 1]
#=> [1, 0]
b == [0, 1]
#=> false
b == [1, 0]
#=> true
c = odds.first
#=> "3"
case
语句以及方法返回"3"
。