Reverse Words in a String

主要是空格的问题:前导空格,后置空格,以及中间多余的空格。不能够用额外的空间,所以我们只能在原字符串上做修改,而不能另申请
解题思路:先翻转单词,再整体翻转,最后遍历的过程中,将多余的空格删除

核心解决问题:

最后遍历已经逆转好的字符串时,如何去除多余空格:
前导空格和中间多余空格通过:

//如果当前字符是空格,且之前已经加入一个空格,则这个空格跳过
s[i] !=' ' || (last && s[last-1]!=s[i])
s[last++] = s[i];

后置空格通过:

s[last] = 0;
if(last &&s[last-1]==' ') //如果上一步引入了空格(因为满足上面判断的后半部分)
s[last-1] = 0;
void reverse(char *s, int start, int end)
{
    while (start < end)
    {
        char tmp = s[start];
        s[start++] = s[end];
        s[end--] = tmp;
    }
}
void reverseWords(char *s)
{
    int last = 0, now = 0;
    while (s[now])
    {
        while (s[now] == ' ') now++;
        last = now;
        while (s[now] != ' '&&s[now] != '\0') now++;
        reverse(s, last, now-1);
    }
    reverse(s, 0, now - 1);
    last = 0;
    //遍历删除多余空格
    for (int i = 0; i < now; i++)
    {
        //前导空格直接跳过 || 如果已经有一个合法空格加入字符串中,则当前相同的字符跳过
        if (s[i] != ' ' || (last &&s[last-1] != s[i]))
        {
            s[last++] = s[i];
        }

    }
    //删除后面的空格
    s[last] = 0;
    if (last&&s[last - 1] == ' ')
        s[last - 1] = 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值