对“日常刷题14”中题目的另一种解法

题目:给定一个字符串,逐个翻转字符串中的每个单词。
示例 1:
输入: “the sky is blue”
输出: “blue is sky the”
示例 2:
输入: " hello world! "
输出: “world! hello”
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
示例 3:
输入: “a good example”
输出: “example good a”
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
(来源:力扣(LeetCode))
虽然题目的来源不同,但是其本质是一样的
思路:以题目中的示例1为例。要把最后一个blue放在第一个输出,其中经过了这些步骤:先把blue倒着拿出来,变成eulb,再倒着放入另一个结果数组中,其中,后两步操作可以理解为先入栈然后出栈,所以这道题可以使用栈实现,只要注意处理一下特殊情况即可。
代码:

char * reverseWords(char * s)
{
    int len,top=-1,i,j=0,flag=0;
    char *stack,*res;
    len=strlen(s);
    if(len==0)
        return s;
    stack=(char*)malloc(sizeof(char)*(len+1));
    res=(char*)malloc(sizeof(char)*(len+1));
    for(i=0;i<len;i++)
        res[i]='\0';
    for(i=len-1;i>=0;i--)//从末尾开始遍历
    {
        if(s[i]!=' ')
        {
            stack[++top]=s[i];
            flag=1;/*遇到不是空格的字符,入栈;
            是单词,标记为1*/
        }
        else
        {
            while(top!=-1)
            {
                res[j]=stack[top];
                --top;
                j++;
            }//遇到空格,出栈,将结果保存在结果数组中
            if(flag==1)
                res[j++]=' ';//单词结尾空格
            flag=0;
        }
    }
    if(top==-1)/*当开头有空格时,结果后面会多出空格,题目
    要求没有空格,需要在后面删去*/
    {
        if(j)//只输入一个空格时,不执行
            j--;
    }
    while(top!=-1)/*当开头没有空格时,最后一个单词
    无法输出,需要在后面补上*/
    {
        res[j]=stack[top];
        --top;
        j++;
    }
    res[j++]='\0';//字符串结尾
    return res;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值