151.翻转字符串里的单词
//交换两个元素
void swap(char* a,char* b){
char temp=*a;
*a=*b;
*b=temp;
}
//反转指定范围的字符串
void reverseStringAb(char* s, int left,int right) {
int mid=(left+right)/2;
for(;left<=mid;left++){
swap(&s[left],&s[right]);
right--;
}
}
//反转字符串的函数
void reverseString(char* s, int sSize) {
int left=0,right=sSize-1;
for(;left<sSize/2;left++){
swap(&s[left],&s[right]);
right--;
}
}
//删除多余空格
void deleteExtraSpace(char* s){
int length= strlen(s);
int slow=0,fast=0;
for(;fast<length;fast++){
if (s[fast] != ' ') {
//对开头处的特殊处理
if(slow!=0){
s[slow]=' ';
slow++;
}
//后面一个判断可以保证在一个单词复制完跳出循环
while( fast<length && s[fast] != ' '){
s[slow]=s[fast];
slow++;
fast++;
}
}
重要!!!!!!
//如果没有这个操作,那么新的字符数组的大小会出现问题,
//因为删除的空格也是字符元素
//删除之后肯定要人为的把字符数组的大小给缩小。
//所谓的删除也只是用别的有用的元素把空格给覆盖掉,所以
s[slow]='\0';
}
}
char* reverseWords(char* s) {
int length= strlen(s);
reverseString(s,length);
deleteExtraSpace(s);
int slow=0;
//这里一定要有等于即i<=length 如数组the sky is blue长度为15
// 在内存中是the sky is blue\0
// e的数组下标为14。\0的下标为15
//如果没有等于那么就会提前跳出循环,进而导致最后一个单词没有逆转,从而出现blue is sky eht
for(int i=0;i<=length;i++){
//就是用i在判断一个单词是否结束,当i指向'空格'或者一个字符串的末尾'\0'可以判断当前单词结束,
// 如果少了i<=length就会导致 s[i]不会等于'\0',进而出现bug
if(s[i]==' ' ||s[i]=='\0'){
reverseStringAb(s,slow,i-1);
slow=i+1;
}
}
return s;
}
leetcode151.翻转字符串里的单词
最新推荐文章于 2024-06-16 22:47:03 发布