【问题标题】:Reverse words of a sentence将句子的单词颠倒
【发布时间】:2015-04-25 16:06:37
【问题描述】:

我想反转一个句子。比如我的字符串如下。

 str = "I am a good boy"

我想要结果"boy good a am I"。我可以使用内置的 Ruby 方法来反转字符串,例如:

 str.split(" ").reverse.join(" ") #=> "boy good a am I"

有什么方法可以在不使用 Ruby 内置方法的情况下做到这一点?

【问题讨论】:

  • 这不是反转字符串。描述得更恰当。
  • 我自己认为你的回答已经足够好了。也许可以在这里或那里少用一种方法,但缺乏可读性可能不值得。
  • 如果您不使用 ruby​​ 内置方法,那么您将如何做呢?许多人要求相反;这是我第一次看到有人问这个。
  • “有什么方法可以在不使用 Ruby 内置方法的情况下做到这一点?” - 你可以使用 Perl 或 Python ;-)
  • @Stefan 或者可能是 C? :)

标签: ruby string


【解决方案1】:

当然,有办法。其实我最喜欢的方式。你说你不想使用 Ruby 的内置函数。好吧,我们不会。原生扩展呢?我知道人们喜欢他们。

首先,创建reverse/reverse.c文件。大部分资源我拿的here.

#include "ruby/ruby.h"

void reverseWords(char *s)
{
    char *word_begin = NULL;
    char *temp = s; 
    while( *temp )
    {
        if (( word_begin == NULL ) && (*temp != ' ') )
        {
            word_begin=temp;
        }
        if(word_begin && ((*(temp+1) == ' ') || (*(temp+1) == '\0')))
        {
            reverse(word_begin, temp);
            word_begin = NULL;
        }
        temp++;
    }
    reverse(s, temp-1);
}

void reverse(char *begin, char *end)
{
    char temp;
    while (begin < end)
    {
        temp = *begin;
        *begin++ = *end;
        *end-- = temp;
    }
}

VALUE reverse_words(VALUE str)
{
    char *s;
    s = RSTRING_PTR(str);
    reverseWords(s);
    return str;
}

void Init_reverse_words() 
{
    VALUE string = rb_const_get(rb_cObject, rb_intern("String"));
    rb_define_method(string, "reverse_words!", reverse_words, 0);
}

其次,创建reverse/extconf.rb文件:

require 'mkmf'
create_makefile('reverse_words')

第三,在终端cd到reverse文件夹并运行:

$ ruby extconf.rb
$ make && make install

最后,在irb进行测试。

irb(main):001:0> require 'reverse_words'
=> true
irb(main):002:0> "foo bar baz".reverse_words!
=> "baz bar foo"

这是在不使用内置函数的情况下反转单词顺序的方法。

【讨论】:

  • 这个答案太棒了。
【解决方案2】:

您可以通过 pop 将每个元素反转为一个新数组

arr, new_arr = ["I", "am", "a", "good", "boy"], []
for i in 0...arr.length do
   new_arr << arr[arr.length - 1 - i]
end
new_arr
# => ["boy", "good", "a", "am", "I"]

【讨论】:

  • 这里你也在使用 ruby​​ 内置的函数,比如 pop。我想要不使用它的解决方案。
  • length 也是一种内置方法,不是吗?另外,你从一个数组而不是一个字符串开始......
【解决方案3】:

试试这个

def reverse(string)
    reverse = ""
    index = 0
    while index < string.length
       reverse = string[index] + reverse
       index += 1
    end
    return reverse
end

reverse_sent = reverse(""I am a good boy"")
reverse_sent.split.map{|word| reverse(word)}.join(" ")

【讨论】:

  • 你使用了 split 和 map 和 join 方法
【解决方案4】:

你不能。

在 ruby​​ 中,您最终总是会使用其他方法,或者重新实现一些已经存在的方法(就像其他答案一样)。

在 C 中你可以使用动态长度数组,但在 ruby​​ 中你必须使用内置方法。

【讨论】:

  • 嗯,他可以创建一个原生扩展。
  • 它不再是红宝石了:)
【解决方案5】:

有没有办法在不使用 Ruby 内置方法的情况下做到这一点?

没有。

Ruby 是一种面向对象的语言。在 OO 中,您通过调用方法来做事。没有其他方法可以执行任何操作。

好吧,从技术上讲,有 一些 Ruby 不是面向对象的角落:if&amp;&amp;||andor 没有对应的方法。所以,这就是你可以使用的全部。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多