题目
leetcode 151
给定一个字符串,逐个翻转字符串中的每个单词。
示例 1:
输入: “the sky is blue”
输出: “blue is sky the”
示例 2:
输入: " hello world! "
输出: “world! hello”
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
示例 3:
输入: “a good example”
输出: “example good a”
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
说明:
无空格字符构成一个单词。
输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
进阶:
请选用 C 语言的用户尝试使用 O(1) 额外空间复杂度的原地解法。
代码
C语言实现O(1)的空间,原地翻转。
void reverse(char *s, int i, int j) {
char t;
while (i < j) {
t = s[i];
s[i] = s[j];
s[j] = t;
i++;
j--;
}
}
char * reverseWords(char * s){
if (*s == '\0') return "\0";
int len = 0, i = 0, j = 0;
while (s[i] == ' ') i++;
if (s[i] == '\0') return "\0";
while (s[i] != '\0') {
if (s[i] == ' ') {
s[j++] = s[i];
while (s[i] != '\0' && s[i] == s[i + 1]) i++;
i++;
} else {
s[j++] = s[i++];
}
}
if (s[j - 1] != ' ') {
s[j] = '\0';
len = j;
} else {
s[j - 1] = '\0';
len = j - 1;
}
reverse(s, 0, len - 1);
i = 0;
while (i < len) {
j = i;
while (s[j] != '\0' && s[j] != ' ') j++;
reverse(s, i, j - 1);
i = j + 1;
}
return s;
}
3084

被折叠的 条评论
为什么被折叠?



