反转Ruby字符串,不使用.reverse方法

时间:2015-07-01 20:50:30

标签: ruby

我正在研究这个编码挑战,我发现我被卡住了。我认为可以在传入的参数上调用.string方法,但现在我不确定。我在Ruby文档中找到的所有内容都表明不是这样。我真的很想在不看解决方案的情况下解决这个问题。有人可以帮助我推动正确的方向吗?

# Write a method that will take a string as input, and return a new
# string with the same letters in reverse order.
# Don't use String's reverse method; that would be too simple.
# Difficulty: easy.

def reverse(string)
string_array = []

string.split()

string_array.push(string)

string_array.sort! { |x,y| y <=> x}
end

# These are tests to check that your code is working. After writing
# your solution, they should all print true.

puts(
  'reverse("abc") == "cba": ' + (reverse("abc") == "cba").to_s
)
puts(
  'reverse("a") == "a": ' + (reverse("a") == "a").to_s
)
puts(
  'reverse("") == "": ' + (reverse("") == "").to_s
)

8 个答案:

答案 0 :(得分:4)

这是最简单的单行解决方案,用于在不使用#reverse的情况下反转字符串,我遇到过 -

"string".chars.reduce { |x, y| y + x }          # => "gnirts"

此外,我从未听说过#string方法,我想您可能会尝试#to_s

答案 1 :(得分:2)

您需要停止搜索替代或聪明的方法,例如更改内容,以便.sort。它过度思考问题,或者在某些方面避免考虑你被要求解决的核心问题。

这个测试试图让你去做的是理解String的内部结构,并且可能会了解如何使用最基本的字符串操作来实现String#reverse。< / p>

最基本的String操作之一是从字符串中获取特定字符。您可以通过调用string[0]来获取第一个字符,通常可以通过调用string[n]来获取第n个字符(零索引)。

此外,您可以通过将它们添加到一起来组合或构建更长的字符串,例如如果您有a="hell"b="o",则c = a + b会将"hello"存储在变量c中。

使用这些知识,找到一种循环原始字符串的方法,并使用它来构建反向字符串,一次一个字符。您可能还需要查找如何获取字符串的长度(另一种基本字符串方法,您可以在任何语言的字符串库中找到它),以及如何按顺序循环遍历数字。

答案 2 :(得分:2)

您正确地将其转换为数组。

def reverse(str)
  str.chars.sort_by.with_index { |_, i| -i }.join
end

答案 3 :(得分:1)

最简单的方法来反转字符串

s = "chetan barawkar"

b = s.length - 1

 while b >= 0

  print  s[b]

  b=b-1

end

答案 4 :(得分:0)

这是我用来反转字符串而不使用.reverse方法的解决方案:

@string = "abcde"
@l = @string.length
@string_reversed = ""
i = @l-1
while i >=0 do
 @string_reversed << @string[i]
 i = i-1
end
return @string_reversed

答案 5 :(得分:0)

以为我会贡献我的菜鸟版本。

def string_reverse(string)
  new_array = []
  formatted_string = string.chars
  new_array << formatted_string.chars.pop until formatted_string.empty?
  new_array.join
end

答案 6 :(得分:0)

大笑,我正在经历同样的挑战。它可能不是优雅的解决方案,但它的工作原理和易于理解:

{{"First String "|add:"Second String"}}

答案 7 :(得分:-4)

看起来你的方式很好,但你也可以简单地使用

def reverse(string)
  string.bytes.collect{|b|
    -b+2*string.bytes.inject(0){|sum,add|
      sum+add
    }/string.length
  }.pack'c*'
end

因为它将计算转移到整数域而不是计算机更自然的字符。当然它通过了所有测试:)