当前位置: 首页 > news >正文

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

牛客网链接:传送门

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

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

输入描述:
每个测试输入包含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日

相关文章:

  • 黑龙江省建设工程质量安全协会网站/百度主页
  • 荔湾区建设工程质量监督站网站/投广告的平台有哪些
  • 编程训练网站/网站流量统计工具
  • 网站建设的总结与评价/推广活动策划方案范文
  • 网站由什么组成/百度官方网站登录
  • 中小企业网络构建/手机优化大师
  • 黑客与画家相同之处
  • 如何运营个人技术博客
  • 磨金石教育摄影技能干货分享|简述特效在影视制作中的四大作用
  • es官网翻译之Exploring Your Cluster
  • springboot整合spring-security
  • PHP 创建 MySQL 表
  • 谈薪时需要注意哪些细节?
  • Java面向对象之多态、内部类、常用API
  • 如何提升软件代码质量?
  • 紧聚焦涡旋光束app设计-VVB2.0
  • 【JavaEE初阶】第一节.计算机是如何工作的
  • Janus的STUN原理与抓包分析