解法:双指针
在c中,字符串是用字符数组来保存的,可以修改(除了常量字符串)。
思路:找到每个单词的边界,对每个单词进行逆序处理。
void swap(char *a, char *b)
{
char temp = *a;
*a = *b;
*b = temp;
}
void reverseWord(char *s, int left, int right)
{
// 同向双指针用来逆序单个单词
int p = left, q = right;
while(p < q)
{
swap(&s[p++], &s[q--]);
}
}
char * reverseWords(char * s){
// s本质上是个字符数组,可以修改
// 字符数组长度 = 字符个数 + 1,'\0'占一个位置
int size = strlen(s) + 1;
// left标记着单词的开始位置
int left = 0;
for(int i = 0; i<size; i++)
{
// 单词后面是空格或者'\0',表示一个单词的结束
if(s[i] == ' '|| s[i] == '\0')
{
// 单词的字符区间为[left, i-1]
reverseWord(s, left, i-1);
// 更新单词的左边界left
left = i+1;
}
}
return s;
}
时间复杂度
O
(
n
)
O(n)
O(n):会遍历一次字符串。同时,空格不会被交换,单词中的字符最多被交换一次。
空间复杂度
O
(
1
)
O(1)
O(1)。