题目链接

图书分类

题目描述

小美图书馆需要根据图书的标题 和页数 来分类。请根据以下规则判断每本图书的类别,规则按顺序检查,如果符合多个,只取第一个匹配的。

  1. 儿童图书 (Children):标题以 "Child" 开头(不区分大小写),且页数
  2. 科技图书 (Tech):标题以 "Tech" 开头(不区分大小写),且页数
  3. 小说 (Novel):标题包含 "Novel"(不区分大小写),无论页数多少。
  4. 其他情况 (Other):返回 "Other"。

输入第一行为一个整数 (),表示有 本图书。此后 行,每行依次输入一个由大小写字母混合组成的字符串 () 和一个整数 ()。

解题思路

本题是一个典型的多条件分支问题。我们需要遍历 本书,对每一本书都应用题目给定的分类规则。

核心要点是严格遵循规则的 优先级顺序。我们可以使用 if-else if-...-else 的级联判断结构来实现这一点,确保每个图书只会被归入第一个满足条件的类别。

另外,题目要求字符串匹配不区分大小写。一个通用且简单的处理方法是:在进行比较前,将读入的标题字符串 统一转换为全小写或全大写。

具体解题步骤如下:

  1. 读取图书总数
  2. 进入一个循环,执行 次。
  3. 在循环中,读取每本书的标题 和页数
  4. 将标题 转换为全小写,得到一个新的字符串 lower_s
  5. 条件一:判断 lower_s 是否以 "child" 开头 并且 。若满足,则输出 "Children"。
  6. 条件二:若不满足上一条件,则判断 lower_s 是否以 "tech" 开头 并且 。若满足,则输出 "Tech"。
  7. 条件三:若不满足以上条件,则判断 lower_s 是否包含子串 "novel"。若满足,则输出 "Novel"。
  8. 其他情况:若以上所有条件均不满足,则输出 "Other"。
  9. 对每本书处理完毕后,换行以便处理下一本。

代码

#include <iostream>
#include <string>
#include <algorithm>
#include <cctype>

using namespace std;

int main() {
    int n;
    cin >> n;
    while (n--) {
        string s;
        int p;
        cin >> s >> p;
        
        string lower_s = s;
        // 就地将字符串副本转换为小写
        transform(lower_s.begin(), lower_s.end(), lower_s.begin(), ::tolower);
        
        // C++20 提供了 starts_with, 但为了兼容性,此处使用 substr
        if (lower_s.rfind("child", 0) == 0 && p <= 100) {
            cout << "Children" << endl;
        } else if (lower_s.rfind("tech", 0) == 0 && p > 200) {
            cout << "Tech" << endl;
        } else if (lower_s.find("novel") != string::npos) {
            cout << "Novel" << endl;
        } else {
            cout << "Other" << endl;
        }
    }
    return 0;
}
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        for (int i = 0; i < n; i++) {
            String s = sc.next();
            int p = sc.nextInt();
            
            String lower_s = s.toLowerCase();
            
            if (lower_s.startsWith("child") && p <= 100) {
                System.out.println("Children");
            } else if (lower_s.startsWith("tech") && p > 200) {
                System.out.println("Tech");
            } else if (lower_s.contains("novel")) {
                System.out.println("Novel");
            } else {
                System.out.println("Other");
            }
        }
    }
}
n = int(input())
for _ in range(n):
    # 接收一行输入并分割
    line = input().split()
    s = line[0]
    p = int(line[1])
    
    lower_s = s.lower()
    
    if lower_s.startswith('child') and p <= 100:
        print('Children')
    elif lower_s.startswith('tech') and p > 200:
        print('Tech')
    elif 'novel' in lower_s:
        print('Novel')
    else:
        print('Other')

算法及复杂度

  • 算法:字符串处理、多条件分支判断。
  • 时间复杂度:,其中 是图书的总数, 是标题字符串的最大长度。对于每本书,都需要进行一次小写转换(成本 )和最多三次字符串匹配操作。字符串匹配(如 startsWith, contains)的时间复杂度也与 相关。
  • 空间复杂度:,主要开销用于存储单本图书的标题字符串。因为每次循环只处理一本书,所以空间是复用的。