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

2025-02-20 学习记录--C/C++-PTA 7-26 单词长度

一、题目描述 ⭐️

在这里插入图片描述

二、代码(C语言)⭐️

#include <stdio.h>

/**
 *  解决 首尾多个空格 的情况:
 *  第1步 获取输入得到:                        ___It's_great_to_see_you_here_____.   _表示空格
 *  第2步 去掉句首的空格 和句尾的符号'.'得到 :       It's_great_to_see_you_here_____
 *  第3步 去掉句尾的空格得到:                      It's_great_to_see_you_here
 *  第4步 统计每一组单词(没有空格的部分)的个数然后输出:4    5     2  3   3   4
 * @return
 */
int main() {
    char strArr[1000]; // 定义一个空数组,用于存放输入的文本
    char ch; // 输入的文本
    int count = 0; // 输入文本的个数

    // 遇到.停止输入
    while(ch != '.') {
        // 输入文本
        scanf("%c",&ch);
        // 将输入的文本存入数组中
        strArr[count] = ch;
        // 输入的文本个数加1
        count++;
    }

    /***
     * 处理空句子:___________. (_表示空格)
     */
    // [' ',' ',' ','.'] 表示空句子,此时不做输出
    // 判断空句子 遍历算出当前有好多个空格,如果句子为空,空格数等于count-1(总数-最后一个点'.')
    int kongGeNum = 0; // 空格数
    // 这里 count-1 是因为:不考虑句尾的符号'.',只考虑空格
    for(int j = 0; j < count - 1; j++) {
        // 统计空格的数量
        if(strArr[j] == ' ') {
            kongGeNum++;
        }
    }
    // 如果空格数刚好等于总数减去1,就表明是空句子:___________. (_表示空格)
    if(kongGeNum == (count - 1)) {
        // 空句子 不做输出
        return 0;
    }

    /**
     * 解决 首尾多个空格 的情况:___It's_great_to_see_you_here_____.(_表示空格)
     * 1、先 去掉 strArr 句首的所有空格 和 去掉最后一个点'.',并将其放入一个新数组 noTouKongGeArr
     * 2、再去掉 noTouKongGeArr 句尾的所有空格,并将其放入一个新数组 noWeiKongGeArr
     * */
    // ___It's_great_to_see_you_here_____.(_表示空格)
    // 1、先 去掉 strArr 句首的所有空格 和 去掉最后一个点'.',并将其放入一个新数组 noTouKongGeArr
    char noTouKongGeArr[1000];
    int noTouKongGeNum = 0; // noTouKongGeArr数组所含值的数量
    int startPut = 0; // 门的开关状态 :0-关着门不让进; 1-开着门可以进

    // 细节: 如果第一个就不是空格 ,就直接开门让所有的都进:It's_great_to_see_you_here_____.(_表示空格)
    if(strArr[0] !=' ') {
        startPut = 1; // 前面没有空格:默认开门
    } else{
        startPut = 0;// 前面有空格:默认关门
    }
    // 遍历 排队来敲门,遇到第一个不是空格的就开门,让他和后面的都进来
    for(int k = 0; k < count - 1; k++) { // count - 1 :注意不要最后的 '.' 进来,防止 '.' 干扰后面的计算
        // (1). 只有门关着 才去找条件开门
        if(startPut == 0){ // 关门中
            // ___It's_great_to_see_you_here_____.(_表示空格)
            // 若 第一次 出现 当前不是空格 且 前一个是空格 的情况,就开门,让它和后面的都放进来
            if(strArr[k] != ' ' && strArr[k-1] == ' ') { // 【注意:是单引号,不是双引号】
                startPut = 1; // 把门打开,不会有关闭它的了,所以后面的人因为门已经开了,就直接进
            }
        }
        /**
         * 如果不用 门的开关状态startPut,
         * 有可能出现 只有满足条件的人能进来,而这些满足条件的后面的人因为不满足条件进不来
         */
        // (2).根据门的 开关状态,放人进来
        if(startPut == 1) { // 当门开着的时候,开始放人进来
            noTouKongGeArr[noTouKongGeNum] = strArr[k];
            noTouKongGeNum++;
        }
    }
    // 现在已经拿到了去掉 句首空格和'.' 的了

    /**
     * 现在已经拿到了去掉 句首空格和'.' 的了:
     * It's_great_to_see_you_here_____(_表示空格)
     * 准备 去掉句尾的空格
     */
    // 又先把门关上
    startPut = 0;
    // 去掉noTouKongGeArr句尾的所有空格,并将其放入一个新数组noWeiKongGeArr中
    char noWeiKongGeArr[1000];
    int noWeiKongGeNum = 0; // noWeiKongGeArr数组所含值的数量

    // 细节处理:如果最后一个不是空格:It's_great_to_see_you_here
    if(noTouKongGeArr[noTouKongGeNum - 1] != ' ') { // 最后一个不是空格【注意:是单引号,不是双引号】
        startPut = 1; //默认开门,放所有的进来
    } else {
        startPut = 0;//末尾有空格,默认关门
    }

    // 倒着遍历 找到 开门条件
    for(int k = noTouKongGeNum -1; k >= 0; k--) {
        // 当门是关着的时候,才去找条件开门
        if(startPut == 0) { // 关门中
            // 若 第一次 出现 当前不是空格 且 前一个是空格 的情况,就开门,让后面遍历的都进来
            if(noTouKongGeArr[k] != ' '  &&  noTouKongGeArr[k+1] == ' ') { // 【注意:是单引号,不是双引号】
                startPut = 1; //开门 让人进来
            }
        }
        // 如果门开着,就让后面的人都进来
        if(startPut == 1) { // 开门中
            noWeiKongGeArr[noWeiKongGeNum] = noTouKongGeArr[k];
            noWeiKongGeNum++;
        }
    }

    /**
     * 因为从后往前遍历 放入数组的,最后的放在最前面,倒序排序的
     * 即 我们拿到的数组 是 It's_great_to_see_you_here 的倒序 :ereh_uoy_ees_ot_taerg_s'tI
     */
    // 因为当前顺序是反的,所以正确交换一下顺序
    char no_touWei_kongGe_Arr[1000]; // 没有头尾 空格,并且顺序正向的数组
    int count_no_touWei_kongGe_Arr = 0; // 正向的数组的元素数量
    for(int i = noWeiKongGeNum - 1; i >= 0; i--){
        no_touWei_kongGe_Arr[count_no_touWei_kongGe_Arr]=noWeiKongGeArr[i];
        count_no_touWei_kongGe_Arr++;
    }
    // 我们拿到了

    /**
     * 我们拿到了去掉头尾空格和'.'的数组:
     * It's_great_to_see_you_here
     * 统计每个单词的长度,并输出
     */
    int length = 0; // 对应单词的长度,初始值为0
    // 遍历数组count_no_touWei_kongGe_Arr
    for(int i = 0; i < count_no_touWei_kongGe_Arr; i++) {
        // It's____great_to_see_you_here(可能出现 中间连续多个空格 的情况)
        // 统计一个单词里面有多少个字母
        if(no_touWei_kongGe_Arr[i] != ' ') { // 不为空格才计算
            length++;
        }
        // It's____great_to_see_you_here
        // 如果 (当前文本是空格 且 下一个文本不是空格) 输出累加的长度
        else if((no_touWei_kongGe_Arr[i] == ' ' && no_touWei_kongGe_Arr[i + 1] != ' ')) {
            printf("%d ",length); // 输出单词长度
            length = 0; // 重置长度给下一个单词用
        }

        // 处理末尾的那个单词输出打印,行末没有最后的空格:
        if( i == count_no_touWei_kongGe_Arr - 1) { // 定位到最后一个单词
                printf("%d",length);
        }
    }

    return 0;
}

在这里插入图片描述


http://www.kler.cn/a/554462.html

相关文章:

  • SQLSTATE「42000」:Syntax error or access violation: 1055……
  • spring微服务+dubbo框架,某一服务启动时提示多个bean存在
  • playwright 实现自动上传,多元素操作
  • 芝加哥学派(Chicago School):金融与经济学的创新力量(中英双语)
  • 基于Openlayers对GeoServer发布的数据进行增删改
  • 芯谷D2038:高集成度六通道电子音量控制电路的音频解决方案
  • 为什么mvcc中?m_ids 列表并不等同于 min_trx_id 和 max_trx_id 之间的所有事务 ID
  • 在项目中调用本地Deepseek(接入本地Deepseek)
  • jQuery UI CSS 框架 API
  • 【并发测试】Redis并发性能测试
  • Vue学习记录21
  • 求矩阵对角线元素的最大值
  • js解析后端传来的如图示的list集合,怎么获取每个map的key和value
  • spring中aop
  • LLC谐振变换器原理
  • 2026考研趋势深度解析:政策变化+高效工具指南
  • Spring Boot 实现 DeepSeek API 调用
  • mysql查看binlog日志
  • 云计算如何解决延迟问题?
  • OceanBase 初探学习历程之——安装部署