题解 | #单词倒排#
单词倒排
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;
}
查看10道真题和解析
阿里云工作强度 600人发布