题解 | #翻转单词#

翻转单词

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-10 11:38
已编辑
湖南理工大学 Java
小浪_Coding:多沟通叭, 公式简历+学历一般的话难找
点赞 评论 收藏
分享
LuvSran:是人我吃。老师就是学校呆久了,就业方面啥都不懂,还自以为是为了我们就业好。我学校就一破双非,计科入行率10%都没有,某老师还天天点名,说是出勤率抬头率前排率高了,华为什么的大厂就会来,我们就是不好好上课才没有厂来招。太搞笑了
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务