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;
}