一尘不染

有效地反转字符数组中单词(不是字符)的顺序

algorithm

给定一个组成单词句子的字符数组,请给出一种有效的算法来反转单词(不是字符)在其中的顺序。

输入和输出示例:

>>> reverse_words("this is a string")
'string a is this'

应该是O(N)时间和O(1)空间(split()并且不允许压入/弹出堆栈)。

难题是从这里拿走的。


阅读 188

收藏
2020-07-28

共1个答案

一尘不染

C / C ++中的解决方案:

void swap(char* str, int i, int j){
    char t = str[i];
    str[i] = str[j];
    str[j] = t;
}

void reverse_string(char* str, int length){
    for(int i=0; i<length/2; i++){
        swap(str, i, length-i-1);
    }
}
void reverse_words(char* str){
    int l = strlen(str);
    //Reverse string
    reverse_string(str,strlen(str));
    int p=0;
    //Find word boundaries and reverse word by word
    for(int i=0; i<l; i++){
        if(str[i] == ' '){
            reverse_string(&str[p], i-p);
            p=i+1;
        }
    }
    //Finally reverse the last word.
    reverse_string(&str[p], l-p);
}

时间应为O(n),空间应为O(1)。

编辑:清理了一下。

字符串的第一遍显然是O(n / 2)= O(n)。第二遍是O(n +所有单词的总长度/ 2)= O(n + n / 2)=
O(n),这使其成为O(n)算法。

2020-07-28