2012-10-14 169 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 –