longest_palindrome,预期为0,得到nil,if-else语句应该在哪里?

时间:2016-06-05 22:30:35

标签: ruby palindrome

接受CodeWar挑战赛。苦苦于修复我的代码,这样如果字符串输入的长度为0,它将显示0而不是nil。

代码如下:(建议?)

def longest_palindrome(string)
  i = 0
  a = []
  while !string[i..-1].empty?
   j = -1
  while !string[i..j].empty?
    s = string[i..j]
     if s.reverse == s
       a << s.length

         if s.length == nil
           a.max = 0
          end
     end
    j -= 1
    end
     i += 1
    end
 a.max
end

1 个答案:

答案 0 :(得分:1)

首先,我想指出您发布的代码的几个问题。

最内层if语句的主体是从不执行,因为

0 != nil

这意味着即使s.length评估为零

s.length == nil

仍然是假的。

我想指出的另一个问题是

a.max = 0

会抛出一个如下所示的错误:

  

未定义的方法max=' for []:Array (repl):17:in longest_palindrome'   (repl):1:在`initialize'

您无法直接设置最大值。你之前从未遇到过这个错误的原因是因为我上面提到的第一个问题。

现在回答你的问题。有很多方法可以做你想要的。例如,您可以检查输入字符串是否为空 在代码的开头,如果是,则立即返回0 从不执行while循环。也许有类似

的东西
return 0 if string.empty?

在代码的开头。

但是从你的问题来看,我认为你所看到的更像是以下内容:

def longest_palindrome(string)

  i = 0
  a = []

  while !string[i..-1].empty?
   j = -1
   while !string[i..j].empty?
    s = string[i..j]
    if s.reverse == s
       a << s.length
   end
   j -= 1
  end
     i += 1
 end

  a.max.to_i
end

感兴趣的是第二行,确保转换 a.max 使用 to_i 方法转换为整数。在nil上调用此方法会将其转换为0。 此外,请注意我已更改代码以解决我之前强调的问题。