颠倒单词的顺序 - 时间复杂度?

时间:2011-05-05 09:08:46

标签: algorithm data-structures string

输入:“我的名字是Pritam” 输出:“Pritam is Name My”

到目前为止我已写过这篇文章,但我对时间复杂度感到困惑

public string ReverseWordsInAString(string str)
    {
        char[] temp = str.ToCharArray();
        int startIndex = 0;
        int endIndex = str.Length - 1;
        temp = ReverseString(temp, startIndex, endIndex);
        endIndex = 0;
        foreach (char c in temp)
        {
            if(c == ' ')
            {
                temp = ReverseString(temp, startIndex, endIndex-1);
                startIndex = endIndex + 1;
            }
            if (endIndex == str.Length-1)
            {
                temp = ReverseString(temp, startIndex, endIndex);
            }
            endIndex++;
        }
        str = new string(temp);
        return str;
    }

    public char[] ReverseString(char[] chr, int start, int end)
    {
        while (start < end)
        {
            char temp = chr[start];
            chr[start] = chr[end];
            chr[end] = temp;
            start++;
            end--;
        }
        return chr;
    }

当我从for循环调用ReverseString方法时,我认为它不再是O(n)解决方案。如果我错了,请纠正我。有没有人有更好的解决方案。

7 个答案:

答案 0 :(得分:2)

Java中的

String str= "My Name is Pritam";
String arr[] = str.split(" ");
for(int i = arr.length-1 ; i >=0 ; i--){
   System.out.println(arr[i]);
}

答案 1 :(得分:2)

您的代码为O(n)。您可以通过查看每个元素所涉及的交换次数来看到这一点,即 2 (一次用于整个字符串的初始反转,第二次用于逐字反转)。此外,foreach循环仅对每个元素进行一次迭代。

答案 2 :(得分:1)

在Ruby中:

sentence = "My name is Pritam"
print sentence.split(" ").reverse.join(" ")

答案 3 :(得分:0)

在C;

char *s = "My Name is Pritam", *t = s + strlen(s), *end = strchr(s,' ')-1;
while( t != end )
{
  *(t = strrchr(t,' ')) = '\0';
  printf( "%s ", --t+2 );
}
printf( "%s", s );

答案 4 :(得分:0)

可能重复,我曾经问过类似的问题。但我收到的回复非常有趣,实际上确实改变了应该考虑复杂性的方式;).... Time Complexity

答案 5 :(得分:0)

拆分字符串并将其推入堆栈。从堆栈弹出元素并将其添加到新字符串。需要额外的空间,但刚刚发布,因为它可能是实现字符串反转的简单方法

public class StringReverse {

public static void main (String args[]){

    String input = "My name is Pritam";

    Stack<String> stack  = new Stack<String>();

    String[] strings= input.split(" ");

    for(String str :strings){
        stack.push(str);
    }

    String reverse = "" ;

    while(!stack.isEmpty()){
        reverse = reverse + " " + stack.pop();
    }

    System.out.println(reverse);
}

}

答案 6 :(得分:0)

在Python中,

sentence = "My name is Pritam"
' '.join(sentence.split(" ")[::-1])