【寒假每日一题】DAY8 倒置字符串

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

牛客网链接传送门

【❤️温馨提示】自己做一遍再看解析效果更佳哟

描述
将一句话的单词进行倒置标点不倒置。

输入描述
每个测试输入包含1个测试用例 I like beijing. 输入用例长度不超过100

输出描述
依次输出倒置之后的字符串,以空格分割

示例1

输入
I like beijing.

输出
beijing. like I

思路这题可以先逆序整个字符串然后再分别逆序每一个单词又或者还可以先逆序每一个单词然后再逆序整个字符串。

那么这题我就先逆序字符串再逆序每一个单词来讲解吧

第一步根据题目要求输入字符串

第二步逆序整个字符串

第三步逆序每一个单词

第四步输出数组a

详细过程下面

 第一步根据题目要求输入字符串

首先根据输入描述输入的长度不能超过100我们就不防多加一个

其次因为scanf默认读到空格就不会再读取了所以用gets。

#include <stdio.h>
int main()
{
    char arr[101];
    //输入字符串
    gets(arr);

    return 0;
}

第二步逆序整个字符串

可以封装一个reverse函数专门来逆序参数可以分别传数组的左下标和右下标然后在函数内部对它们进行交换

#include <stdio.h>
#include <string.h>

void reverse(char* left, char* right)
{
    //当left < right说明还有元素可以交换
    while(left < right)
    {
        char tmp = *left;
        *left = *right;
        *right = tmp;
        left ++;
        right--;
    }
}

int main()
{
    char arr[101];
    //输入
    gets(arr);

    //逆序整个字符串
    int sz = strlen(arr); //求字符串长度
    reverse(arr,arr + sz - 1);

    return 0;
}

第三步逆序每一个单词

逆序每一个单词确实头疼但是我们还可以运用上一步reverse函数还帮助逆序但需要分别找到单词的左下标和右下标。

        注意千万不能移动arr因为最后还要靠arr来输出字符串所以可以用char* p来存放arr来代替arr移动然后再用char* start = p来固定起始位置

        接下来让p往后判断只要p不为空格并且p不等于“\0”就能完整找到一个单词所以这是一个循环如果最后单词不是“\0”结尾说明还能找到单词就让p继续向后走所以这整体就是一个循环其条件是让p到达“\0”位置就停下来“\0”的asc码值为0.

【代码实现】

#include <stdio.h>
#include <string.h>

void reverse(char* left, char* right)
{
    //当left < right说明还有元素可以交换
    while(left < right)
    {
        char tmp = *left;
        *left = *right;
        *right = tmp;
        left ++;
        right--;
    }

}

int main()
{
    char arr[101];
    //输入
    gets(arr);

    //逆序整个字符串
    int sz = strlen(arr); //求字符串长度
    reverse(arr,arr + sz - 1);

    //逆序每一个单词
    char* p = arr;

    while(*p) //若*p == '\0','\0'的ASC码为0则会跳出循环
    {
        char* start = p;

        while(*p != ' ' && *p != '\0')
        {
            p++;
        }  
        //当*p为空格跳出循环p指向的就是空格所以p - 1
        reverse(start,p - 1);
        if (*p != '\0')
        {
            p++;
        }
    }

    return 0;
}

第四步输出数组a

【完整代码】

#include <stdio.h>
#include <string.h>

void reverse(char* left, char* right)
{
    //当left < right说明还有元素可以交换
    while(left < right)
    {
        char tmp = *left;
        *left = *right;
        *right = tmp;
        left ++;
        right--;
    }

}

int main()
{
    char arr[101];
    //输入
    gets(arr);

    //逆序整个字符串
    int sz = strlen(arr); //求字符串长度
    reverse(arr,arr + sz - 1);

    //逆序每一个单词
    char* p = arr;

    while(*p)
    {
        char* start = p;

        while(*p != ' ' && *p != '\0')
        {
            p++;
        }  
        reverse(start,p - 1);
        if (*p != '\0')
        {
            p++;
        }
    }
    //输出数组a
    printf("%s\n",arr);
    
    return 0;
}

最后这题也是完美AC啦

总结这题难点在于如何逆序单词。

 2023年1月16日

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6