翻转字符串里的单词(双指针,字符串分割)
1. 题目描述
难度:中等
2. 题目分析
这道题我们需要注意的点有以下几个:
- 每个单词之间都要有一个并且仅有一个空格
- 翻转之后的字符串首尾两端要去电空格
- 使用O(1)的空间
只使用O(1)的额外空间的话,只能在原数组上进行转换:
- 字符串翻转法(C)
利用双指针对对字符串进行整体翻转,如果对输入“the sky is blue” 翻转之后为“eulb si yks eht”。之后在对每个单词进行反转,结果为“blue is sky the”,就完成了。在翻转的时候对多余的空格进行去除即可。 - 字符串分割法(Python)
字符串的题目利用python是很方便的,可以先对字符串进行分割,然后在反转合成新的字符串即可。
3. C语言实现
代码如下:
// 去除指定位置的yuansu
char * removeSpaces(char *s, int index){
int len = strlen(s);
for(int i = index; i < len-1; i++){
s[i] = s[i+1];
}
s[len-1] = '\0';
return s;
}
char * reverseWords(char * s){
int len = strlen(s);
if(len == 0) return s;
if(len == 1) return s[0]==' '? "":s;
int left=0, right=len-1, index, count = 0;
char temp;
// 去除字符串两边的空格
while(s[right] == ' '){
right--;
if(right == -1) return "";
}
while(s[left] == ' '){
left++;
}
for(int i = 0; i <= right-left; i++){
s[i] = s[i+left];
}
s[right-left+1] = '\0';
len = strlen(s);
left = 0;
right = len -1;
// 翻转整个字符串
while(left < right){
temp = s[left];
s[left] = s[right];
s[right] = temp;
left++;
right--;
}
// 去除中间多余的空格
for(int i = 0; i < len; i++){
if(s[i] == ' '){
if(count > 0){
s = removeSpaces(s, i);
len = strlen(s);
i--;
}
else count++;
}
else count = 0;
}
// 转换每个单词
left = 0;
right = 0;
for(int i = 0; i < len; i++){
if(s[i] == ' ' || i == len-1){
right = i==len-1?i:i-1;
while(left < right){
temp = s[left];
s[left] = s[right];
s[right] = temp;
left++;
right--;
}
left = i+1;
}
}
return s;
}
运行结果为:
4. Python实现
代码如下:
class Solution:
def reverseWords(self, s: str) -> str:
# 分割字符串
tem = s.split(' ')
res = ''
# 去除tem 中的空元素
while '' in tem :
tem .remove('')
# 合成新的字符串
for i in range(len(tem )):
res = res + tem [len(tem )-1-i] + ' '
return res [:-1]
运行结果为: