【问题标题】:Palindrome index in HackerRankHackerRank 中的回文索引
【发布时间】:2020-02-17 15:04:24
【问题描述】:

我正在解决来自 HackerRank 的palindrome index 问题,如下所述。

一些单挑会继续进行。谢谢!

这是我的代码:

# Complete the palindromeIndex function below.
def palindromeIndex(s)
  # slen = s.length
  splt = s.split('')

  n = s.reverse
  nsplt = n.split('')

  if n == s
    return -1
  elsif n != s 
    splt.each do |p|            
      if nsplt[p] != splt[p]
        return p
      end
    end
  else 
    return -1
  end
end

在第一行中,我首先拆分给定的字符串及其各自的反向形式。然后我试图将原始字符串与反转字符串进行比较。如果它们相等,我的程序应该返回-1。如果不是,我应该遍历最初拆分的字符串并检查索引是否存在差异,并返回与主字符串不同的字符位置。

到目前为止,我不确定我是否正确,但我在第一次尝试时也遇到了错误。

solution.rb:18:in `block in palindromeIndex': no implicit conversion of String into Integer (TypeError)
from solution.rb:17:in `each'
from solution.rb:17:in `palindromeIndex'
from solution.rb:34:in `block in <main>'
from solution.rb:31:in `times'
from solution.rb:31:in `<main>'

我这里有什么问题吗?

【问题讨论】:

  • 您最后的else 内容永远不会被调用。 n 等于 s 或不等于 s。由于这两个表达式都被检查代码永远不会到达最后一个else。我怀疑您想将该代码移至 splt.each 循环之后。 return -1 将在循环结束时被调用,并且在循环过程中没有返回。

标签: ruby palindrome


【解决方案1】:
splt.each do |p|

上面返回s中的每个字符,而不是字符的位置。这就是为什么您会收到错误消息...对于“abba”,您正在做splt['a'] 而不是splt[0]

如果你想要这个职位,你可以做 each_with_index

splt.each_with_index do |_, p|

由于您不需要角色本身,我们在迭代中为其分配了下划线_

或者,您可以使用整数范围

(0...splt.length).each do |p|

注意在范围内使用三个点,这意味着从零到比长度小一,因为五个字符的字符串只有从 0 到 4 的索引。

或者您可以简单地循环执行字符的次数...

splt.length.times do |p|

【讨论】:

  • 我会使用splt.each_index 而不是(0...splt.length).each
  • @3limin4t0r tmtowtdi :)
  • 别忘了split.length.times,它也在相同的范围内进行迭代,看起来更好一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-16
  • 2020-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多