我一直在研究 Ruby,覺得我學到了很多東西。我目前正在嘗試解決平衡括號演算法,但在一個條件下苦苦掙扎。這是我所擁有的:
def balanced?(list_of_brackets)
if list_of_brackets.length % 2 != 0
false
else
stack = []
bracket_sets = {
'{' => '}',
'[' => ']',
'(' => ')'
}
list_of_brackets.chars do |bracket|
if bracket == "{" or "[" or "("
puts "#{bracket} is an opening bracket"
else
puts "#{bracket} is a closing bracket"
end
end
end
stack.empty?
end
puts balanced?('{}()[]')
我得到的結果是:
{ is an opening bracket
} is an opening bracket
( is an opening bracket
) is an opening bracket
[ is an opening bracket
] is an opening bracket
右括號以某種方式通過第一個條件。我在這里遺漏了一些東西,但我找不到它。也許另一雙眼睛可以在這里幫助我。我很感激任何幫助和/或建議!
uj5u.com熱心網友回復:
if 陳述句if bracket == "{" or "[" or "("需要對陳述句bracket == X中的每個or條件都有一個。改變:
if bracket == "{" or "[" or "("
到
if bracket == "{" or bracket == "[" or bracket == "("
......這應該有效。完整的代碼是:
def balanced?(list_of_brackets)
if list_of_brackets.length % 2 != 0
false
else
stack = []
bracket_sets = {
'{' => '}',
'[' => ']',
'(' => ')'
}
list_of_brackets.chars do |bracket|
if bracket == "{" or bracket == "[" or bracket == "("
puts "#{bracket} is an opening bracket"
else
puts "#{bracket} is a closing bracket"
end
end
end
stack.empty?
end
puts balanced?('{}()[]')
uj5u.com熱心網友回復:
這
if bracket == "{" or "[" or "("
基本上是檢查括號是否等于“{”或“[”是否為真或“(”是否為真,您錯過bracket ==了其余的。這就是為什么他們采用 if 分支并且您得到所有??這些都是開括號. 該問題的解決方案是比較它們中的每一個:
if bracket == "{" || bracket == "[" || bracket == "("
...
PS:確保不要OR與混淆||,它們有不同的程式。
uj5u.com熱心網友回復:
我將使用術語外殼來指代圓括號 ( '('and ')')、方括號 ( '['and ']') 和大括號 ( '{'and '}')。一串外殼在以下情況下是平衡的:
- 每個左括號都有一個匹配的右括號,反之亦然;
- 每個左括號都有一個匹配的右括號,反之亦然;
- 每個左大括號都有一個匹配的右大括號,反之亦然;和
- 所有匹配對都是良好嵌套的,因為每個匹配對都必須由零個或多個匹配對組成的字串分隔。
例如,'([{}])'是良好嵌套的,而'([{]})'不是,因為分隔匹配對的字串'['和]',即'{',不是匹配對。
如果在問題的代碼中,字串的長度為 evenstack被初始化為一個永遠不會改變的空陣列,那么回傳值stack.empty?將始終為true。例如,balanced?(')[') #=> true。您需要類似以下內容。
RIGHT_ENCLOSURE_PAIRS = { '}'=>'{', ']'=>'[', ')'=>'(' }
RIGHT_ENCLOSURES = RIGHT_ENCLOSURE_PAIRS.keys
def balanced?(str)
stack = []
str.each_char do |c|
if RIGHT_ENCLOSURES.include?(c)
return false if stack.empty? || stack.last != RIGHT_ENCLOSURE_PAIRS[c]
stack.pop
else
stack << c
end
end
stack.empty?
end
balanced? '{}()[]' #=> true
balanced? '([{}])' #=> true
balanced? '([{}]{})' #=> true
balanced? '((([[[{{{}}}]]])))' #=> true
balanced? '{[]' #=> false
balanced? '{{(([[' #=> false
balanced? '{()[{]}(([]))' #=> false
我最初將以下保護子句作為該方法的第一行。
return false if str.length.odd?
然而,經過反思,我洗掉了它,因為對于偶數個外殼的字串執行它所花費的時間可能比為具有奇數個外殼的字串節省的時間長得多。
我沒有包含puts諸如puts "#{c} is an opening enclosure"它們通常只用于除錯的陳述句,但如果需要,當然可以添加它們,在這種情況下,撰寫它們可能會更有幫助
ENCLOSURE_TYPE = { '('=>'left parenthesis', ')'=>'right parenthesis',
'['=>'left bracket', ']'=>'right bracket',
'{'=>'left brace', '}'=>'right brace' }
puts "#{c} is a #{ENCLOSURE_TYPE[c]}"
uj5u.com熱心網友回復:
語法問題已由其他人解決,但如果您想擺脫與 的冗余比較bracket,這里是您可能需要考慮的另一種更簡化的方法:
["{", "[" , "("].include? bracket
這會將所有您想要的字串放入一個單獨的字串中array,然后測驗以查看是否bracket包含在該陣列中。或者您甚至可以使用現有的bracket_sets哈希值并測驗以查看您的括號是否包含在該keys組中...
bracket_sets.key?(bracket)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/400261.html
標籤:红宝石
