【漫步刷题路】- 逆序字符串II

????题目要求:

字符串:I love you

逆序后结果: you love me


????逆置法

假设逆置: Man Max

->整体逆置: xaM naM

->分别逆置 对xaM逆置:Max

对naM逆置:Man

->最终结果为: Max Man


????思路:

  • 先整体逆置
  • 定义两个指针,一个start,一个end,end负责移动。遇到字符串的空格就停下来,逆置[start,end-1]区间字符的内容 然后end和start指向end+1的位置。再继续寻找空格
  • 当end遇到的是\0,说明已经到了字符串的尾了,退出循环

????图解


????代码

#include<stdio.h>
#include<assert.h>
#include<string.h>
//区间逆置
void reverse(char* left, char* right)
{
    assert(left && right);
    while (left < right)
    {
        char str = *right;
        *right = *left;
        *left = str;
        right--;
        left++;
    }
}
int main()
{
    char str[100] = "Chase the wisdom 99";
    int len = strlen(str);
    //1.先整体逆置
    reverse(str, str + len - 1);
    //2.分别逆置,以空格为分隔 
    char* end = str;
    char* start = str;
    //循环判断条件:end指向的字符不是\0
    while (*end != '\0')
    {
        //当end没有遇到\0 和空格就继续
        while ( (*end != '\0')  && (*end != ' '))
        {
            end++;
        }
        //当end跳出循环时,指向的就是空格或者\0  逆置[start,end-1]的内容
        reverse(start, end-1);
        //end向后移动,进行下一次循环
        //start从end位置开始,重新定义起始区间
        end++;
        start = end;
    }
    printf(str);
    return 0;
}



上一篇:[LeetCode] Sort List


下一篇:[LeetCode] Best Time to Buy and Sell Stock