题解 | #翻转单词#
翻转单词
http://www.nowcoder.com/practice/aa7e93b78b294a859bb52d5b965aaaf1
所有单词都要翻转,那咱就一个个来翻嘛,每次找到一个单词的左右边界,然后用左右互换来翻转单词即可。
char* reverseWord(char* str ) {
int left = 0, right = 0, n = strlen(str); //假设第一个单词的左右边界下标都是0,即起始处
while(right < n){ //右边界最大也就是n-1
left = right; //每次找单词时都假设左边界和右边界一样,然后再去找右边界,即找空格
while(right < n && str[right] != ' ') //只要不是空格就继续往后走
right++; //在遇到空格时停下,right为空格的下标
int i = left, j = right - 1; //待翻转单词的左右边界
while(i < j){ //用左右依次交换来翻转单词
int tmp = str[i];
str[i] = str[j];
str[j] = tmp;
i++; j--; //左下标往右走,右下标往左走
}
while(str[right] == ' ')
right++; //翻转完一个单词,开始找下一个单词,right继续后移,找到第一个不是空格的即为下一个单词的起始处
}
return str;
}
或者分开写,反转函数单独放一边更清楚
char* reverse(char* str, int left, int right){ //反转函数
int i = left, j = right;
while(i < j){
int tmp = str[i];
str[i] = str[j];
str[j] = tmp;
i++;
j--;
}
return str;
}
char* reverseWord(char* str ) {
int n = strlen(str);
int i = 0, j = 0;
while(j < n){
while(str[i] == ' ') //
i++;
//遇到非空的第一个即为单词左边界,i停在左边界处
j = i; //j从左边界开始遍历,寻找右边界
while(j < n && str[j] != ' ')
j++; //j遇到第一个空格表示一个单词已结束,右边界为j-1
reverse(str, i, j-1);
i = j; //i从j开始继续寻找下一个单词的左边界
}
return str;
}
查看10道真题和解析
