题解 | #单词倒排#

单词倒排

https://www.nowcoder.com/practice/81544a4989df4109b33c2d65037c5836

//分享一个比较简单的思路,用代码量换难度
#include <stdio.h>
#include<string.h>
int main()
{
    char arr[10001] = "";
    gets(arr);
    int sz = strlen(arr);
    int i = 0, j = 0, left = 0, right = 0, flag = 0, tmp = 0;
  //flag记录从后往前遍历时遇到的第一个字母,tmp记录从后往前遍历时遇到字母后的第一个空格
    for (i = 0; i < sz; i++)
    {
	  //如果不是字母,就置换成空格
        if (!(((arr[i] >= 'A') && (arr[i] <= 'Z')) || ((arr[i] >= 'a') && (arr[i] <= 'z'))))
        {
            arr[i] = ' ';
        }
    }
    for (i = sz - 1; i >= 0; i--)
    {
	  //从后往前遍历,遇到第一个字母之后,记录当前位置,并且flag置为1防止right被改动
        if ((((arr[i] >= 'A') && (arr[i] <= 'Z')) || ((arr[i] >= 'a') && (arr[i] <= 'z')))&&(flag==0))
        {
            right = i;
            flag = 1;
        }
	  //遇到第一个空格,并且flag=1说明后面已经有字母,同时tmp=0表示此空格是第一个空格
        else if ((arr[i] == ' ') && (flag == 1)&&(tmp==0))
        {
		   //单词左下标是该空格的下一个
            left = i + 1;
            tmp = 1;
		  //从左到右打印这个单词的每个字符
            for (j = left; j <= right; j++)
            {
                printf("%c", arr[j]);
            }
		  //打印完毕再输出一个空格
            printf(" ");
		  //再将flag和tmp置为原始状态,准备下一轮循环,打印下一个单词
            flag = 0;
            tmp = 0;
            continue;
        }
	  //此处处理字符串首个单词,i=0,在字母前面没有空格,直接打印该单词,至此全部打印完毕
        if ((i == 0) && (flag == 1))
        {
            for (j = 0; j <= right; j++)
            {
                printf("%c", arr[j]);
            }
        }
    }
    return 0;
}

全部评论

相关推荐

1 收藏 评论
分享
牛客网
牛客企业服务