Ruby中字符串的反向单词?

Ruby中字符串的反向单词?,ruby,Ruby,我正在尝试在Ruby中反转字符串的单词,而不使用反转方法。我想实现以下已知算法: 把整根绳子倒过来 反转反转字符串中的每个单词 以下是我的想法: class String def custom_reverse(start, limit) i_start = start i_end = limit - 1 while (i_start <= i_end) tmp = self[i_start] self[i_start] = self

我正在尝试在Ruby中反转字符串的单词,而不使用反转方法。我想实现以下已知算法:

  • 把整根绳子倒过来
  • 反转反转字符串中的每个单词
以下是我的想法:

class String
  def custom_reverse(start, limit)
    i_start = start
    i_end = limit - 1

    while (i_start <= i_end)
      tmp = self[i_start]
      self[i_start] = self[i_end]
      self[i_end] = tmp
      i_start += 1
      i_end -= 1
    end
    return self
  end

  def custom_reverse_words
    self.custom_reverse(0, self.size)

    i_start = 0
    i_end = 0

    while (i_end <= self.length)
      if (i_end == self.length || self[i_end] == ' ')
        self.custom_reverse(i_start, i_end)
        i_start += 1
      end

      i_end += 1
    end
  end
end

test_str = "hello there how are you"
p test_str.custom_reverse_words
类字符串
def自定义_反转(启动、限制)
i_start=开始
i_end=极限值-1

而(i_start任何反向操作的要点都是以与通常相反的顺序迭代元素。也就是说,在通常使用集合(0..N-1)的情况下,您将通过(N-1..0)或更具体地说,通过N-1-i,其中i为0..N-1:

class String
  def reverse_words
    split(/\s+/).map{|w|wl=w.length-1;(0..wl).map{|i|w[wl-i]}.join}.join(' ')
  end
end

puts "this is reverse test".reverse_words.inspect
# => "siht si esrever tset"
同样的原则也适用于给定字符串中的单词


这类面试问题的价值极为可疑。在生产代码中“聪明”通常是一个非常糟糕的主意。

这里有一种方法可以在不使用内置的
reverse
的情况下反转数组:

class Array
  def reverse 
    tmp_ary = self.dup
    ret_ary = []
    self.size.times do
      ret_ary << tmp_ary.pop
    end
    ret_ary
  end
end

%w[a b c].reverse # => ["c", "b", "a"]
类数组
def倒档
tmp_ary=self.dup
ret_ary=[]
自我尺寸。倍做
检索[“c”、“b”、“a”]

tmp\u ary.pop
是秘密。
pop
从数组的末尾删除元素。

我能想到的最干净的解决方案是:

class Array
  def my_reverse
    sort_by.with_index {|_, i| -i}
  end
end

class String
  def words
    split(/\W+/)
  end

  def revert_words
    words.my_reverse.join(' ')
  end

  def revert_each_word
    words.map {|w| w.chars.my_reverse.join}.join(' ')
  end
end
还有一种方法:

class String
  def reverse_words
    split.inject([]){|str, word| str.unshift word}.join(' ')
  end

  def reverse_chars
    each_char.inject([]){|str, char| str.unshift char}.join('')
  end
end
修订过的 Carey提出了一个很好的观点,反向字符可以简化,因为字符串已经是可枚举的:

class String
  def reverse_chars
    each_char.inject(""){|str, char| str.insert(0, char) }
  end
end

定义一个简单高效的数组反转器后:

def reverse_array(a)
  (a.length / 2).times {|i| a[i],a[-(i+1)] = a[-(i+1)],a[i]}
  a
end
你可以很直截了当地颠倒一句话:

def reverse_sentence(s)
  reverse_array(s.split('')).join.split(" ").map{|w| reverse_array(w.split('')).join}.join(" ")
end

reverse_sentence "Howdy pardner"     # => "pardner Howdy"

学术练习?只是好奇你的限制是什么。不是学术。我只是尝试从面试问题中练习Ruby,而不使用它的一些高级方法。你引用的是已经更改的字符!尝试将整个字符串存储在一个临时变量中,并将其用于引用,这是一个学术问题stion,你正在努力学习,因为在生产代码中你只会使用
反向
。我想知道为什么-1.这不是一个合适的问题?+1表示“此类面试问题的价值非常可疑。”tadman先生,我完全同意你的看法,但是如果你在面试中,被要求将字符串中的单词颠倒过来,然后你继续做
my_str.split(“”)。reverse.join(“”)
,面试官很可能想知道你是否理解算法,并避免使用高级函数。对吗?@HommerSmith要正确准备最糟糕的技术面试,你需要为几乎所有发明的逻辑难题提供罐装解决方案,能够为所有制造的芯片编写汇编代码,了解算法介绍和四人帮设计模式的书。虽然这使你成为一个更好的候选人,但我不确定这会使你成为一个更好的程序员,也不确定你是否愿意为一家重视这些东西的公司工作。并行作业的不错!不错,凯文。+1我喜欢这样的事实对于
reverse\u chars
您不需要转换为数组并返回。请注意,您不需要
join(“”)
--它已经是一个字符串了。谢谢Cary。我想如果你用数组预填充inject,你仍然需要加入,但你提出了一个很好的观点。我正在用一种更简单的方法编辑我的答案。哈!我在脑子里混合了字符串和数组,这是不正确的,所以请不要使用属性。我没有阅读你的方法carefully.当我看到
str unshift char
时,我认为
unshift
是一个字符串方法(可能是因为我过去希望这样),在这种情况下,对象一定是一个空字符串,而事实并非如此。很好,很干净,兄弟,尽管我很喜欢@Kevin关于使用方法的建议
reverse\u chars
(或者可能是
倒转单词
)。这个问题的所有高质量答案!+1