2012-10-14 174 views
1

为什么此代码给这个输入提供错误的输出?回文检查红宝石

def palindrome?(str) 
    str.delete('^a-zA-Z') 
    str.downcase 
    str == str.reverse 
end 


INPUT = "A man, a plan, a canal -- Panama" 

OUTPUT = Failure/Error: palindrome?("A man, a plan, a canal -- Panama").should be_true, "Incorrect results for input: \"A man, a plan, a canal -- Panama\"" 
     Incorrect results for input: "A man, a plan, a canal -- Panama" 
    # spec.rb:7:in `block (2 levels) in <top (required)>' 
    # ./lib/rspec_runner.rb:36:in `block in run_rspec' 
    # ./lib/rspec_runner.rb:32:in `run_rspec' 
    # ./lib/rspec_runner.rb:23:in `run' 
    # lib/graders/weighted_rspec_grader.rb:6:in `grade!' 
    # ./grade:31:in `<main>' 

回答

4

的字符串不修改字符串本身的删除和downcase方法,他们返回变更后的副本。如果你要修改的接收器,使用爆炸变种:

str.delete!('[^a-zA-Z]') 
str.downcase! 

上第二个想法

,不这样做,因为这样可怕的事情发生了:

string = "hello123" 
palindrome?(string) 
string #=> "OLLEH" 

相反,要一个参数的副本并修改:

def palindrome?(arg) 
    str = arg.dup 
    str.delete!('[^a-zA-Z]') 
    str.downcase! 
    str == str.reverse 
end 
+4

或者由于非修改版本返回你可以只把它们连一个新的字符串:'STR == str.delete( '[^ A-ZA-Z]')downcase.reverse'。 –

+0

^this ....绝对是这个^ – Kyle

+0

啊是的 - 我会说你的更习惯。 – hdgarrood

0

如何找到一个字符串的回文总数

class String 
    def palindrome? 
    self == self.strip.reverse 
    end 
    def sub_str_arr 
    (0..self.length).inject([]){|ai,i| 
     (1..self.length - i).inject(ai){|aj,j| 
     aj << self[i,j] 
     } 
    } 
    end 
    def num_palindromes 
    return -1 if self.length > 100000000 
    self.sub_str_arr.reject!{|item| item if item.length < 2 || !item.palindrome?}.size 
    end 
end 

puts "dabadbadbadbdbadbadbdabdbadbadbadbadbadadadbdbdbdbadbdabadbadbdbadbabdabdbbdabdabdbadba".num_palindromes 
+0

总计应该是52 BTW –