0

我有一个初学者问题。我试图简单地将修改后的索引替换回原始字符串中以创建一个字符串数组。它们连续大写下一个元素中的下一个索引。这就是我所拥有的。谁能帮我看看我错过了什么?

def wave(str)
  result = []
  index = 0
  while index < str.length
    i = str[index]
    if i == " "
      index =+ 1
    else
      upper = i.upcase
      val = str.rindex(upper) -1
      result.push("#{str[0...val]}#{str[val..-1]}")
      index += 1
    end
  end
  result
end

我正在尝试从 ---> wave(hello) 获取: ["Hello", "hEllo", "heLlo", "helLo", "hellO"]

谢谢你。

4

3 回答 3

0

你的else部分不太正确:

  1. 你不需要找到最右边的索引,因为你已经有了index
  2. upper从未使用过
  3. 正确的范围差一

这是一个工作变体:

    # ...
    else
      upper = i.upcase
      result.push("#{str[0...index]}#{upper}#{str[index+1..-1]}")
      index += 1
    end
    # ...

您可以使用each_charandwith_index使您的代码更惯用:

def wave(str)
  result = []
  str.each_char.with_index do |char, index|
    next if char == " "
    result.push("#{str[0...index]}#{char.upcase}#{str[index+1..-1]}")
  end
  result
end
于 2020-04-02T11:24:28.520 回答
0

问题是你声明了一个变量 upper 但你没有使用它。尝试重写您的代码,这次使用它。如果您不确定每行代码中发生了什么,只需将print放在它前面。

于 2020-04-02T11:40:32.120 回答
0

另一种选择是以这种方式将Enumerable#mapObject#tap一起使用:

str = 'hello'

str.size.times.map { |n| str.dup.tap { |s_dup| s_dup[n] = str[n].upcase } }

#=> ["Hello", "hEllo", "heLlo", "helLo", "hellO"]

需要复制原始字符串以避免更改将返回的原始字符串本身["HELLO", "HELLO", "HELLO", "HELLO", "HELLO"]

对于跳过空格:

str.size.times.flat_map { |n| str.dup.tap { |s_dup| s_dup[n] = str[n].upcase } unless str[n] == ' ' }
于 2020-04-02T12:09:26.497 回答