跳转至

3374. 首字母大写 II

难度困难

题目描述

表:user_content

+--------------+---------+
| Column Name  | Type    |
+--------------+---------+
| content_id   | int     |
| content_text | varchar |
+--------------+---------+
content_id 是该表的唯一键。
每一行包含一个唯一的 ID 以及对应的文本内容。

单词是指不包含空格的极大非空字符序列。

编写一个解决方案,按照以下规则对 content_text 列中的文本进行转换,并对每个单词应用这些规则:

  • 如果单词以一个不是英文字母的字符开头,则保持整个单词不变。
  • 否则,如果单词由两个或更多非空的英文字母部分通过连字符 - 连接而成,则将每个部分的首字母转换为大写,并将每个部分的其余字母转换为小写。例如,top-rated 转换为 Top-Rated,FR-ONT-end 转换为 Fr-Ont-End。
  • 否则,将单词的首字母转换为大写,并将其余所有英文字母转换为小写。所有特殊字符保持不变。

所有其他格式和空格必须保持不变。

返回结果表,其中同时包含原始的 content_text 以及按照上述规则转换后的文本。

结果格式如下例所示。

 

示例:

输入:

user_content 表:

+------------+---------------------------------+
| content_id | content_text                    |
+------------+---------------------------------+
| 1          | hello world of SQL              |
| 2          | the QUICK-brown fox             |
| 3          | modern-day DATA science         |
| 4          | web-based FRONT-end development |
+------------+---------------------------------+

输出:

+------------+---------------------------------+---------------------------------+
| content_id | original_text                   | converted_text                  |
+------------+---------------------------------+---------------------------------+
| 1          | hello world of SQL              | Hello World Of Sql              |
| 2          | the QUICK-brown fox             | The Quick-Brown Fox             |
| 3          | modern-day DATA science         | Modern-Day Data Science         |
| 4          | web-based FRONT-end development | Web-Based Front-End Development |
+------------+---------------------------------+---------------------------------+

解释:

  • 对于 content_id = 1:
    • 将每个单词的首字母大写,得到 "Hello World Of Sql"。
  • 对于 content_id = 2:
    • 带连字符的单词 "QUICK-brown" 转换为 "Quick-Brown"。
    • 其他单词按照普通的大小写转换规则处理。
  • 对于 content_id = 3:
    • 带连字符的单词 "modern-day" 转换为 "Modern-Day"。
    • "DATA" 转换为 "Data"。
  • 对于 content_id = 4:
    • "web-based" 转换为 "Web-Based"。
    • "FRONT-end" 转换为 "Front-End"。

 

提示:

  • content_text 仅包含英文字母、空格以及字符 \、@、-、/、^ 和 ,。

解法

方法一

思考

在 I 的按词首字母大写之外,连字符分隔的每一段也要单独首字母大写。

先按空格切词;词内若含 -,再按 - 切段并分别 \(\textit{capitalize}\)。

这样 foo-bar 变为 Foo-Bar,其余规则与 I 相同。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
import pandas as pd


def capitalize_content(user_content: pd.DataFrame) -> pd.DataFrame:
    def convert_text(text: str) -> str:
        return " ".join(
            (
                "-".join([part.capitalize() for part in word.split("-")])
                if "-" in word
                else word.capitalize()
            )
            for word in text.split(" ")
        )

    user_content["converted_text"] = user_content["content_text"].apply(convert_text)
    return user_content.rename(columns={"content_text": "original_text"})[
        ["content_id", "original_text", "converted_text"]
    ]

评论