151 Reverse Words in a String

关键是处理前后和中间的空格,关键代码:
last = 0;
for(int i = 0; i < len; i++)
if(s[i] != ' ' || (last && s[last-1] != s[i]))
s[last++] = s[i];
'#'定义为' '

XXX###XX#### ==> XXX#XX#

if(s[i] == ' ' && last && s[last-1] != s[i]) 这个逻辑保证X后面的#可以保存下来,避免中间的#都被删除掉

void reverse(char *s, int l, int r)
{
    while(l < r){
        char tmp = s[l];
        s[l] = s[r];
        s[r] = tmp;
        l++;
        r--;
    }

}

void reverseWords(char *s) {
    if(s == NULL)
        return;
    int len = strlen(s);
    if(len == 0 )
        return;
//remove white space
    int last = 0;
    for(int i = 0; i < len; i++)
        if(s[i] != ' ' || (last && s[last-1] != s[i]))
            s[last++] = s[i];

    if(last == 0) // 说明全是空格
    {
        s[last] = '\0';
        return;
    }
    if(s[last-1] == ' '){ //原字符串尾部有空格 ,处理完后最后一个字符后面的空格还会保存,需要替换为'\0'
        s[last-1] = '\0';
        len = last-1;
    }else{//原字符串尾部没有空格,之前把当前last 指向设置为字符串结尾标志'\0'
        s[last] = '\0';
        len =last;
    }
    int l = 0;
    int r = 0;
    for(int i = 0; i <= len; i++){
        if(s[i] == ' ' || s[i] == '\0'){
            r = i-1;
            reverse(s, l , r);
            l = i+1;
        }
    }
 
    reverse(s, 0, strlen(s)-1);


}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容