题解 | #单词倒排#
单词倒排
https://www.nowcoder.com/practice/81544a4989df4109b33c2d65037c5836
#include <stdio.h> #include <stdlib.h> #include <string.h> void reverse(char* start, char* end){ //用于反转整个字符串 char tmp; while(start < end){ tmp = *start; *start = *end; *end = tmp; start++, end--; } } //用于将end-start的字符,逐个赋值给dst,并更新dstLen void copyReverseToDst(char* start, char* end, char* dst, int* dstlen){ while(end >= start){ *dst++ = *end--; (*dstlen)++; } } int main() { char input[10001]; char* ret = (char*)malloc(sizeof(char)*10001); //为返回值申请空间 int retLen = 0; int len, start, end; gets(input); len = strlen(input); reverse(&input[0], &input[len-1]); //翻转整个字符串 start = end = 0; while(1){ while((input[end]>='a'&&input[end]<='z') || (input[end]>='A'&&input[end]<='Z'))end++; //找到完整单词的下一位 copyReverseToDst(&input[start], &input[end-1], &ret[retLen], &retLen); //将该单词反转赋值到dst,注意end-1,因此此时end指向的是单词的下一位,即结束符 ret[retLen++] = ' '; //间隔 while(end < len && !((input[end]>='a'&&input[end]<='z') || (input[end]>='A'&&input[end]<='Z')))end++; //找到下一个单词的起始,虽然这里用end来移动,但是end会赋值给start if(end >= len)break; //如果end超过最大输入长度,则表示倒排结束 start = end; } ret[retLen] = '\0'; //结束符 printf("%s", ret); free(ret); return 0; }