有一種接受字串作為引數的方法。該字串將被格式化,因此每個字母后跟一個數字。該方法應回傳字串的“未壓縮”版本,其中每個字母根據直接出現在字母后面的數字重復多次。
def uncompress(str)
new_str = ""
(0 ... str.length - 1).each do |i|
new_str = str[i] * str[i 1].to_i
end
new_str
end
結果:
uncompress('a2b4c1') # 'aabbbbc'
如果 str[i] 是數字而 str[i 1] 是字母,為什么這段代碼不回傳錯誤?
uj5u.com熱心網友回復:
當您在字串中進行替換時,讓我們使用#gsub并扔一個塊給它。
irb(main):028:0> "h5a2".gsub(/[a-zA-Z]\d /) { |x| x[0] * x[1..-1].to_i }
=> "hhhhhaa"
正則運算式正在尋找一個字符,后跟一個(可能)多位數字。然后它用字符乘以數字來代替它。(轉換為 int with#to_i至關重要,因為嘗試將字串乘以字串是行不通的。)
或者,如果您想修改原始字串,您可以使用#gsub!.
irb(main):032:0> s = 'a2b4c1'
irb(main):033:0> s.gsub!(/[a-zA-Z]\d /) { |x| x[0] * x[1..-1].to_i }
=> "aabbbbc"
irb(main):034:0> s
=> "aabbbbc"
如果格式固定為單個字符后跟單個數字乘數,則可以通過對正則運算式進行細微修改來輕松適應,而無需對塊進行任何更改。
irb(main):040:0> s = 'a2b4c156'
irb(main):041:0> s.gsub(/[a-zA-Z0-9]\d/) { |x| x[0] * x[1..-1].to_i }
=> "aabbbbc555555"
使用您的方法,重要的是我們將索引增加 2,所以讓我們生成一個索引陣列。
irb(main):032:0> str = "h5d3"
irb(main):033:0> (0 ... str.length).step(2).to_a
=> [0, 2]
然后我們可以回圈這些:
def uncompress(str)
new_str = ""
(0 ... str.length).step(2) do |i|
new_str = str[i] * str[i 1].to_i
end
new_str
end
現在:
irb(main):042:0> uncompress("a4d2b1")
=> "aaaaddb"
uj5u.com熱心網友回復:
掃描、拆分和整數強制
我不會嘗試除錯您的代碼,而是提供我認為更簡單、更慣用的解決方案:
str = "a2b4c1"
str.scan(/\p{Alpha}\d/).map(&:chars).map { _1 * _2.to_i }
#=> ["aa", "bbbb", "c"]
通過掃描您的字母 數字模式,然后將匹配的模式拆分為一個字符陣列,您可以創建一個易于迭代的陣列元素集合。通過在方法鏈的任何部分后添加注釋字符來檢查回傳的內容,您可以輕松地查看此處的中間步驟。
最后,您只需要確保每個字符陣列的第二個元素從字串強制轉換為整數,否則您會嘗試將字串與其他字串相乘。例如"a" * "2"不會完成你想要的,而"a" * 2會。
uj5u.com熱心網友回復:
在 Ruby 中,您可以像我在下面顯示的那樣輕松地做到這一點。我們不必像 C 或其他語言那樣撰寫代碼。
輸入
a="a2b4c1"
程式
p a.chars
.slice_after(/\d /)
.map{|x|x.last.to_i.times.map{x.first}.join}
.join
輸出
"aabbbbc"
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/493384.html
