1009 说反话

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

输入格式:

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

输出格式:

每个测试用例的输出占一行,输出倒序后的句子。

输入样例:

Hello World Here I Come

输出样例:

Come I Here World Hello

源代码

#include <stdio.h>

// 算法思想:由于输入时各个单词之间是由空格分开的,所以只需要从后往
// 前遍历字符数组,遇到空格即表示找到一个单词的开始,然后从此处向后
// 输出即可,输出结束索引就是函数传递的第二个参数
// 由于是从后往前遍历的,所以每一个单词输出后便以当前单词开始的前两个位置作为
// 新的结束点输出前一个单词
void printPiece(char ch[], int endIndex)
{
    if (endIndex >= 0)
    {
        int i;
        // 从当前位置开始寻找前面最近的空格.空格后一个位置就是当前单词的开始位置
        //  对于第一个单词而言,因为前面没有空格,所以只能用i==-1来判断
        for (i = endIndex; ch[i] != ' ' && i >= 0;)
        {
            i--;
        }

        // 跳出上一个循环的条件是当前遇到了空格或者当前字符的索引为-1,则当前位置
        // 的下一个位置就是单词的开始位置,结束为止就是endIndex指定的位置
        for (int j = i + 1; j <= endIndex; j++)
        {
            printf("%c", ch[j]);
        }

        // i不等于-1说明当前单词不是第一个单词,所以需要用空格和其他单词分开,而i==-1时
        // 不需要空格
        if (i != -1)
        {
            printf(" ");
        }
        else
        {
            printf("\n");
        }
        // 继续向前找到前一个单词输出
        printPiece(ch, i - 1);
    }
}

int main()
{

    // 用于保存输入的字符串
    char input[81];

    char ch;

    int i;
    // 一次从控制台获取一个字符
    for (i = 0; i < 80 && (ch = getchar()) != '\n'; i++)
    {
        input[i] = ch;
    }

    //输入完毕后在字符串末尾添加一个空字符,表示输入结束
    input[i + 1] = '\0';

    printPiece(input, i);
    return 0;
}

不足之处

pat上面有几组测试数据答案错误,由于没有具体的数据所以还没找到问题出在哪,后面如果发现在再回来改

    原文作者:画家的野猫
    原文地址: https://www.jianshu.com/p/5ee5718f453d
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞