Ruby中字符串的反向单词?
我正在尝试在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
- 把整根绳子倒过来
- 反转反转字符串中的每个单词
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