Ruby 中的字符串比较未返回正确的测试

String comparison in Ruby not returning correct test

提问人:dromologue 提问时间:10/31/2023 最后编辑:Rajagopalandromologue 更新时间:11/1/2023 访问量:92

问:

我正在尝试测试回文,但此代码在测试中从未返回 true。

for a in (0..(myString.length/2)) do
  if (myString[a] == myString[myString.length-a+1])
    p = true
  else
    p = false
  end
end

我错过了什么?

我已经尝试了不同的等式和字符串方法。

谢谢

Ruby 字符串

评论

0赞 Holger Just 10/31/2023
因为你实际上从来没有任何东西......return
0赞 dromologue 10/31/2023
那么,您将如何更改代码以返回某些内容呢?
0赞 Stefan 10/31/2023
您是否尝试调试代码?我会首先打印索引并在循环中检查它们是否正确。amyString.length-a+1
1赞 steenslag 11/1/2023
(myString == myString.reverse)

答:

1赞 Nick James 10/31/2023 #1

你有一个你需要的地方。+-

if (myString[a] == myString[myString.length-a+1]) #your code
if (myString[a] == myString[myString.length-a-1]) #updated code with "a-1" instead of "a+1"
if (myString[a] == myString[-(a+1)]) #alternative solution: Negative indexes would be my prefered way to solve this

您分配了局部变量 p 而不是调用方法Kernel#p

p = true #your code
p "true" #updated code converted to `p` method

完全更新的代码

myString = "abba"

for a in (0..(myString.length/2)) do
  if (myString[a] == myString[-(a+1)])
    p "true"
  else
    p "false"
  end
end

=begin
code outputs:
true
true
true
=end

评论

0赞 dromologue 10/31/2023
谢谢。更新后的代码:myString = gets.chomp pal = true for a in (0..(myString.length/2)) do if (myString[a] == myString[-(a+1)]) pal = true else pal = false break end end if pal put “this is a palindrome” else put “this is not a palindrome” end
0赞 Alexander 11/1/2023
不相关,但你应该避免在 Ruby 中使用。这很奇怪。而是首选。在这种情况下,是一个完美的选择。for(0..(myString.length/2)).each do |a| ... endany?
0赞 engineersmnky 11/2/2023
此外,当这会将字符串“true”或“false”打印到 STDOUT N 次时,实际返回值将始终为 a,这不会指示原始字符串是否为回文。Range
3赞 spickermann 10/31/2023 #2

代码中有两个问题:

首先,比较中第二个字符的索引计算不正确。我们以第一次迭代为例。在第一次迭代中,将是 .这意味着第二个字符的位置将被计算为(想象字符串),这将超出字符串的边界。相反,字符串中的最后一个字符具有索引 ,因为索引从 开始计数。a0racecar7-0+1 = 860

这可以通过计算第二个索引来修复,如下所示:myString.length -a-1

第二个问题是,当两个字符不匹配时,您不会立即返回。想象一下字符串 .在第一次迭代中,将进行比较并设置为 。但是在下一次迭代中,并进行比较,并将更改为 ,尽管第一次迭代已经证明该字符串不是回文。abbcacpfalsebbptrue

我建议将实现更改为:

def palindrome?(string)
  0.upto(string.length / 2 - 1).all? { |i| string[i] == string[-i - 1] }
end

palindrome?('racecar')
#=> true

palindrome?('foobar')
#=> false

请参阅 Integer#uptoArray#all? 以及 String#[] 在负索引下的行为

评论

0赞 Stefan 10/31/2023
您可以使用来摆脱显式语句。all?return
0赞 spickermann 10/31/2023
@Stefan。谢谢,这是个好主意。
0赞 Waleed Bin Tariq 11/1/2023 #3

我的预期代码:

def is_palindrome(myString)
  for a in 0..(myString.length/2) do
    if myString[a] != myString[myString.length-a-1]
      return false
    end
  end
  return true
end

FOr测试添加:把is_palindrome(“赛车”)

评论

0赞 Alexander 11/1/2023
你可以用一个显式返回的 for 循环替换它:any?(0..(myString.length/2)).any? { |a| myString[a] != myString[myString.length-a-1] }