7-32 说反话-加强版 (20分)

给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。

输入格式:

测试输入包含一个测试用例,在一行内给出总长度不超过500 000的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用若干个空格分开。

输出格式:

每个测试用例的输出占一行,输出倒序后的句子,并且保证单词间只有1个空格。

输入样例:

Hello World   Here I Come

 

输出样例:

Come I Here World Hello

 思路:

一开始的思路是先用二维数组单独提取每个单词,因为有中间多个空格的情况。提取成功后再局部逆置加总体逆置的方法实现。代码是这样的:

#include<stdio.h>
#include<string.h>

int main(void)
{
    //通过空格提取词语

    //输入
    
    char str[100][500001];
    int i = -1;
    int j = -1;
    int k = 0;
    char ch;

    while((ch = getchar()) != '\0')
    {
        if((ch < 97) && (ch > 32)) //该字为大写字母且不是空格,小于97为大写,大于32为空格
        {
            i++;
            j++;
            str[i][j] = ch;
                 
        } 
        if(ch != ' ') //小写字母的情况
        {
            j++;
            str[i][j] = ch;            
        }
        j = -1;
    }
    

    //输出测试
    for(k = 0; k < i; k++)
        printf("%s ", str[i]);

    printf("\n");    

    
    return 0;


}

但是,编译的时候一直有段错误,静态调试的时候认为逻辑上并没有什么问题,但是一直编译都不能成功,后来看到这篇觉得用队列的思想解决才是最高效的。

代码如下:

#include<stdio.h>
#include<string.h>

int main(void)
{
    char str[500001];
    int i = 0;
    int j = 0;
    int k = 0;
    int rear = 0;
    int front = 0;
    int count = 0;
    int len = 0;

    gets(str);
    len = strlen(str);
    for(i = len - 1; i >= 0; i--)//逆向遍历
    {
        if(str[i] != ' ')
        {
            rear = i;//指向当前单词的最后一个字母

            for(j = i - 1; j >= 0; j--)
            {
                if(str[j] == ' ')
                {
                    break;
                }
            }

            front = j + 1;//指向当前单词的第一个字母

        if(count > 0)
        {
            printf(" ");
        }

        for(k = front; k <= rear; k++)
        {
            printf("%c", str[k]);
        }

        count++;
        i = j;

        }

    }

return 0;

}

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值