2021年11月4日 颠倒句子

 

先消除多余空格,再颠倒一整个表,最后颠倒每个单词; 

char * reverseWords(char * s){
    int i=0,j=1,len=strlen(s);
    char t;
    "开始排除首尾中间多余的空格"

    "开始排除头部空格,找到第一个非空字符,之后全部往前移"
    if(s[0]==' '){
        while(s[j]==' ')
            j++;
        while(i+j<=len){
            s[i]=s[i+j];
            i++;
        }
    }

    "开始排除中间的空格,如果有连续的空格后面的元素全部往前移"
    for(i=0;i<len;i++){
        if(s[i]!=' ') ;
        else{
            if(s[i+1]!=' ') ;
            else{
                while(s[i+1]==' ')
                    for(j=i+1;j<len;j++)
                               "注意这边是j<len而不是j<len-1,a[len]永远是'\0'空字符"
                        s[j]=s[j+1];
            }
        }
        len=strlen(s);
    }

"开始排除最后一个空格,因为最后一个空格在之前排除中是死角,无法处理,所以多加一个if语句来判断"
    if(s[len-1]==' ') s[len-1]='\0'; 
    
    "颠倒整个表"
    len=strlen(s);
    for(i=0;i<=(len-1)/2;i++){"向下取整,所以不用分类奇数偶数";
        t=s[i];
        s[i]=s[len-1-i];
        s[len-1-i]=t;
    }

    "颠倒每一个单词"
    i=0;
    int tail=0,head=0,lenth;
    while(tail<len){
        while(s[tail+1]!=' '&&s[tail+1]!='\0')
            tail++;
        lenth=tail-head+1;
        for(j=head;j<=head+(lenth-1)/2;j++){
            t=s[j];
            s[j]=s[head+tail-j];
            s[head+tail-j]=t;
        }
        tail=tail+2;
        head=tail;
    }
    return s;
}

总结:

数组的处理要小心边界,然后就是,好好学c++之后在刷题吧哈哈哈。

Guess you like

Origin blog.csdn.net/LEewhITe2003/article/details/121149347