反转字符串中单词的顺序

Arn*_*shn 68 string algorithm data-structures

我有这个string s1 = "My name is X Y Z",我想扭转这些词的顺序s1 = "Z Y X is name My".

我可以使用额外的数组来做到这一点.我认为很难,但有可能在现场(不使用额外的数据结构)并且时间复杂度为O(n)吗?

Bil*_*ard 129

反转整个字符串,然后反转每个单词的字母.

第一次传递后,字符串将是

s1 = "Z Y X si eman yM"
Run Code Online (Sandbox Code Playgroud)

在第二次通过后,它将是

s1 = "Z Y X is name My"
Run Code Online (Sandbox Code Playgroud)

  • @Miky,不,这是O(n).在O(n)中可以轻松地反转整个字符串,并且在O(n)中也可以轻松地反转字符串中的每个字.O(n)+ O(n)= O(n). (31认同)
  • 这就是为什么你做第二遍来反转每个单词的字母. (15认同)
  • 请记住,对于涉及国际化的任何实际应用,扭转字符串都是一场噩梦而不仅仅是扭转一系列字符 (4认同)
  • 例如,"名字"在他的例子中并没有被颠倒过来. (2认同)
  • 我想在Java中没有办法解决这个问题,因为Java中的String是不可变的.我对么? (2认同)

Dem*_*emi 33

将字符串反转,然后在第二遍中反转每个字......

在c#中,完全就地没有其他数组:

static char[] ReverseAllWords(char[] in_text)
{
    int lindex = 0;
    int rindex = in_text.Length - 1;
    if (rindex > 1)
    {
        //reverse complete phrase
        in_text = ReverseString(in_text, 0, rindex);

        //reverse each word in resultant reversed phrase
        for (rindex = 0; rindex <= in_text.Length; rindex++)
        {
            if (rindex == in_text.Length || in_text[rindex] == ' ')
            {
                in_text = ReverseString(in_text, lindex, rindex - 1);
                lindex = rindex + 1;
            }
        }
    }
    return in_text;
}

static char[] ReverseString(char[] intext, int lindex, int rindex)
{
    char tempc;
    while (lindex < rindex)
    {
        tempc = intext[lindex];
        intext[lindex++] = intext[rindex];
        intext[rindex--] = tempc;
    }
    return intext;
}
Run Code Online (Sandbox Code Playgroud)

  • @Pritam:每次都不在for循环中运行ReverseString.字符串上有一个完整的反向传递(第一次传递),然后for循环找到划分字边界的空格(另一个传递).在(并且,重要的是,不是在每个索引处)调用的ReverseString是O(m),其中m是单词的长度.每个单词都需要它.所有O(m)字长操作的总和等于O(n).因此,该算法是最坏情况3*O(n),其仍然是O(n).如果在每个索引都调用了ReverseString,我认为你会是正确的...... (3认同)

小智 14

Not exactly in place, but anyway: Python:

>>> a = "These pretzels are making me thirsty"
>>> " ".join(a.split()[::-1])
'thirsty me making are pretzels These'
Run Code Online (Sandbox Code Playgroud)

  • 没有@Shadow,这不是一个好的答案.问题是关于解决问题的算法(关注所使用的数据结构和复杂性的顺序)而不是高级语言的实现.(也不是你的 - 尽管两者都是"正确的") (12认同)

小智 13

在Smalltalk中:

'These pretzels are making me thirsty' subStrings reduce: [:a :b| b, ' ', a]
Run Code Online (Sandbox Code Playgroud)

我知道没有人关心Smalltalk,但它对我来说太美了.