【PTA数据结构 | C语言版】出院

本专栏持续输出数据结构题目集,欢迎订阅。

文章目录

题目

A:最近出了一个饮料营养等级你们知道吗?例如无糖的饮料是 A 级,可乐是 D 级……
B:那……无糖可乐是什么级别?
C:AD 级吧。
A:出院!
B:出什么院,你也给我进去!

以上是某群中一段有趣的对话。请你按照里面的逻辑,在已知某些饮料的等级的情况下,给饮料定级。定级的方法是:

  • 如果是已知等级的饮料,直接输出等级;
  • 对于一个新饮料的名字,你需要将名字拆成两个已知等级的部分,然后输出这个级别。例如:Diet是A,Coke是D,那么DietCoke就是AD;

如果新饮料无法拆解或者有多种拆解方法,统一定为 D 级。

输入格式:
输入第一行是两个正整数 N,M (1≤N,M≤100),表示已知的饮料有 N 种,需要定级的饮料有 M 种。

接下来首先是 N 行,每行是一个字符串和一个字符,表示一种饮料的名字和对应的等级,等级只有 A,B,C,D 四种。

然后是 M 行,每行是一个字符串,表示需要定级的饮料的名字。

所有饮料名字只包含有大小写字母,长度不超过 30,给定拥有等级的饮料的名字不会重复。

输出格式:
对于每一个需要定级的饮料,输出定好的定级。

输入样例:
5 6
Diet A
LowSugarTea B
Milk C
Coke D
Water A
DietCoke
Pepsi
Milk
CokeWater
GoodMilk
dietCoke

输出样例:
AD
D
C
DA
D
D

题目引用自睿抗机器人开发者大赛真题(2023年)。

代码

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

#define MAX_NAME_LEN 31  // 饮料名称最大长度
#define MAX_KNOWN 100    // 已知饮料最大数量

// 存储已知饮料及其等级的结构体
typedef struct {
    char name[MAX_NAME_LEN];
    char level;
} Drink;

// 查找饮料名称是否在已知列表中,返回等级,未找到返回0
char findLevel(Drink known[], int n, char* name) {
    for (int i = 0; i < n; i++) {
        if (strcmp(known[i].name, name) == 0) {
            return known[i].level;
        }
    }
    return 0;
}

int main() {
    int N, M;
    scanf("%d %d", &N, &M);
    
    Drink known[MAX_KNOWN];
    
    // 读取已知饮料及其等级
    for (int i = 0; i < N; i++) {
        scanf("%s %c", known[i].name, &known[i].level);
    }
    
    // 处理每个需要定级的饮料
    for (int i = 0; i < M; i++) {
        char drink[MAX_NAME_LEN];
        scanf("%s", drink);
        int len = strlen(drink);
        
        // 检查是否为已知饮料
        char level = findLevel(known, N, drink);
        if (level != 0) {
            printf("%c\n", level);
            continue;
        }
        
        // 尝试拆解为两个已知饮料的组合
        char firstLevel = 0, secondLevel = 0;
        int count = 0;  // 有效拆解方法的数量
        
        // 遍历所有可能的拆分位置
        for (int split = 1; split < len; split++) {
            char part1[MAX_NAME_LEN] = {0};
            char part2[MAX_NAME_LEN] = {0};
            
            // 分割为两部分
            strncpy(part1, drink, split);
            part1[split] = '\0';
            strcpy(part2, drink + split);
            
            // 检查两部分是否都是已知饮料
            char l1 = findLevel(known, N, part1);
            char l2 = findLevel(known, N, part2);
            
            if (l1 != 0 && l2 != 0) {
                count++;
                // 记录第一次有效拆解的等级
                if (count == 1) {
                    firstLevel = l1;
                    secondLevel = l2;
                }
            }
        }
        
        // 根据拆解结果输出等级
        if (count == 1) {
            printf("%c%c\n", firstLevel, secondLevel);
        } else {
            printf("D\n");
        }
    }
    
    return 0;
}
### 从字符串中提取数字并转换为整数的实现 在Python中,可以使用正则表达式模块`re`来高效地提取字符串中的所有数字,并将它们组合成一个整数。以下是具体的实现方法[^1]: ```python import re def extract_and_sum_numbers(s): # 使用正则表达式匹配字符串中的所有数字 numbers = re.findall(r'\d+', s) # \d+ 匹配一个或多个连续的数字 # 将提取的数字字符串列表转换为整数列表 numbers_int = [int(num) for num in numbers] # 计算所有数字的总和 total_sum = sum(numbers_int) return total_sum, numbers_int # 测试示例 s = "43...3y2.f67se2.666." result_sum, result_list = extract_and_sum_numbers(s) print("提取的数字列表:", result_list) # 输出: [43, 3, 2, 67, 2, 666] print("数字总和:", result_sum) # 输出: 783 ``` 上述代码通过正则表达式`\d+`匹配字符串中的所有数字,并将它们转换为整数后求和。这种方法适用于包含任意字符的字符串。 如果需要按照PTA题目要求提取字符串中的所有数字字符并将其转换为一个整数,则可以参考以下实现[^2]: ```python def conv(s): result = 0 for char in s: if '0' <= char <= '9': result = result * 10 + int(char) return result # 测试示例 s = "free82jeep5" result = conv(s) print("转换后的整数:", result) # 输出: 825 ``` 该函数遍历字符串中的每个字符,仅保留数字字符并将其逐步拼接成一个整数。 ### 注意事项 - 如果字符串中可能包含负号`-`,需要在解析前判断其位置是否位于数字之前[^3]。 - 对于十六进制字符的过滤与转换,可以扩展正则表达式的匹配规则以支持字母`a-f`和`A-F`。 - 在PTA题目中,输入字符串长度通常有限制(如不超过80个字符),因此需确保算法的时间复杂度适中[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋说

感谢打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值