题目描述
给定一个字符串,逐个翻转字符串中的每个单词。
示例 1:
输入: “the sky is blue”
输出: “blue is sky the”
示例 2:
输入: " hello world! "
输出: “world! hello”
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
示例 3:
输入: “a good example”
输出: “example good a”
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
说明:
无空格字符构成一个单词。
输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
解题思路
首先将字符串s全部反转存入a,判断,若a长度为0或全为空格,直接返回b空串;然后从后向前定位第一个不为空格的字符。下面开始遍历数组a,共分为两种情况,第一,a字符串末尾存在空格,从首位开始统计每次遇到空格前非空格字符的个数,再从空格位开始反向遍历,将遍历到的字符存入数组b,并添加一位空格(b数组末尾无需添加),直到数组a遍历结束。第二,a字符串末尾不存在空格,末尾部分需要单独讨论,首先讨论a字符串包括最后一个空格位之前的部分(这部分与第一种情况完全相同),a数组空格后的部分需要从最后一位开始反向遍历存入b数组(判断条件由是否为空格变成是否为末位),全部情况讨论完毕,返回b数组。
提交代码
char * reverseWords(char * s){
int w=0;
int len = strlen(s);
int len1=len-1;
char *a=(char *)calloc(len+10,sizeof(char));
char *b=(char *)calloc(len+10,sizeof(char));
int cnt=0;
int m=0;
for(int i=0,j=len-1;i<len,j>=0;i++,j--){
a[i]=s[j];
}
int sum1=0;
if(len==0) return b;
for(int i=0;i<len;i++){
if(a[i]==' ') sum1++;
}
if(sum1==len) return b;
while(1){
if(a[len1]!=' ') break;
len1--;
}
for(int i=0;i<=len;i++){
if(len1<len-1){
if(a[i]!=' '){
cnt++;
}else{
if(cnt!=0){
for(int j=i-1;j>=i-cnt;j--){
b[m]=a[j];
m++;
}
if(i<len1-1){
b[m]=' ';
m++;
}
}
cnt=0;
}
}else if(len1==len-1){
if(a[i]!=' '&&i<len-1){
cnt++;
}else{
if(i==len-1){
for(int j=i;j>=i-cnt;j--){
b[m]=a[j];
m++;
}
}
else if(cnt!=0){
for(int j=i-1;j>=i-cnt;j--){
b[m]=a[j];
w=j;
m++;
}
if(i<len-1){
b[m]=' ';
m++;
}
}
cnt=0;
}
}
}
return b;
}