提问人:dromologue 提问时间:10/31/2023 最后编辑:Rajagopalandromologue 更新时间:11/1/2023 访问量:92
Ruby 中的字符串比较未返回正确的测试
String comparison in Ruby not returning correct test
问:
我正在尝试测试回文,但此代码在测试中从未返回 true。
for a in (0..(myString.length/2)) do
if (myString[a] == myString[myString.length-a+1])
p = true
else
p = false
end
end
我错过了什么?
我已经尝试了不同的等式和字符串方法。
谢谢
答:
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| ... end
any?
0赞
engineersmnky
11/2/2023
此外,当这会将字符串“true”或“false”打印到 STDOUT N 次时,实际返回值将始终为 a,这不会指示原始字符串是否为回文。Range
3赞
spickermann
10/31/2023
#2
代码中有两个问题:
首先,比较中第二个字符的索引计算不正确。我们以第一次迭代为例。在第一次迭代中,将是 .这意味着第二个字符的位置将被计算为(想象字符串),这将超出字符串的边界。相反,字符串中的最后一个字符具有索引 ,因为索引从 开始计数。a
0
racecar
7-0+1 = 8
6
0
这可以通过计算第二个索引来修复,如下所示:myString.length -a-1
第二个问题是,当两个字符不匹配时,您不会立即返回。想象一下字符串 .在第一次迭代中,将进行比较并设置为 。但是在下一次迭代中,并进行比较,并将更改为 ,尽管第一次迭代已经证明该字符串不是回文。abbc
a
c
p
false
b
b
p
true
我建议将实现更改为:
def palindrome?(string)
0.upto(string.length / 2 - 1).all? { |i| string[i] == string[-i - 1] }
end
palindrome?('racecar')
#=> true
palindrome?('foobar')
#=> false
请参阅 Integer#upto
和 Array#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] }
评论
return
a
myString.length-a+1
myString == myString.reverse
)