一种思路:时间复杂度,空间复杂度
#include
#include
#include
//逆置相应段的元素
void reverse(char* str, int left, int right) {
while (left < right) {
char tmp = str[left];
str[left] = str[right];
str[right] = tmp;
++left;
--right;
}
}
int main() {
char str[10000];
gets(str);
//数组长度
int len = strlen(str);
//清理多余非字母字符
int slow = 0, fast = 0;
//flag默认为1,表示空格已经被记录,直到出现新单词才变0,表示需要一个新空格
int flag = 1;
while (fast < len) {
if (isalpha(str[fast])) {
str[slow++] = str[fast];
flag = 0;
}
else if (flag == 0) {
str[slow++] = ' ';
flag = 1;
}
++fast;
}
str[slow] = '\0';
//倒序字符串
int cnt = strlen(str);
reverse(str, 0, cnt-1);
//逐个的单个的逆置单词
int left = 0;
int right = 0;
flag = 1;
//记录每个单词的开始下标和结束下标,再逆置两个下标之间的元素
while (right <= cnt) {
if (isalpha(str[right])) {
++right;
flag = 0;
}
else {
reverse(str, left, right - 1);
++right;
left = right;
}
}
puts(str);
return 0;
}
京公网安备 11010502036488号