目录
按单词长度排序句子——Python实现及详解
题目描述
给定一个句子 text
,句子的格式满足以下条件:
- 句子的首字母大写。
- 句子中的每个单词由单个空格分隔。
- 句子里包含多个单词。
请将句子中的单词重新排列,使所有单词按单词长度升序排列;如果两个单词长度相同,则保持它们在原句子中的相对顺序不变。
最后,返回一个新的句子,要求:
- 句子首字母大写。
- 其余字母均小写。
- 单词间用单个空格分隔。
解题分析
主要任务
- 按单词长度升序排序:根据单词的字符数排序。
- 保持相同长度单词的相对顺序:即“稳定排序”。
- 格式化输出:
-
- 首字母大写。
- 其余小写。
- 单词之间单空格。
关键点
- Python 的内置排序函数
sorted()
和列表的sort()
方法是稳定排序算法,保证长度相同时元素相对顺序不变。 - 原句第一个单词首字母大写,其他字母小写;重新排序后,也要保持首个单词首字母大写。
- 原句单词中首字母可能大写(如句首),需要先统一转小写后排序,避免大小写影响排序结果和相对顺序。
解题思路和步骤
- 拆分句子
使用split()
把句子拆成单词列表。 - 统一小写
为方便排序和比较,先把所有单词转为小写,确保稳定排序不受大小写影响。 - 排序
利用sorted()
或list.sort()
,以单词长度为键进行排序,保证稳定性。 - 首字母大写处理
排序后将第一个单词首字母大写,其他单词全部小写。 - 拼接句子
用空格把单词重新合并成句子。
代码实现
class Solution:
def arrangeWords(self, text: str) -> str:
# 拆分句子成单词列表
words = text.split()
# 转成小写方便排序,保持原单词索引以保证稳定排序
lowered_words = [w.lower() for w in words]
# 记录原索引,方便排序后保持相同长度单词原顺序
indexed_words = list(enumerate(lowered_words))
# 按单词长度排序,稳定排序保证长度相同单词相对顺序不变
indexed_words.sort(key=lambda x: len(x[1]))
# 排序后的单词(小写)
sorted_words = [w for i, w in indexed_words]
# 首字母大写,其余小写
sorted_words[0] = sorted_words[0].capitalize()
# 拼接成句子返回
return ' '.join(sorted_words)
示例说明
假设输入:
text = "Keep calm and code on"
拆分单词:
["Keep", "calm", "and", "code", "on"]
转换为小写:
["keep", "calm", "and", "code", "on"]
附带索引,便于稳定排序:
[(0, "keep"), (1, "calm"), (2, "and"), (3, "code"), (4, "on")]
按单词长度排序:
- "on" (长度 2)
- "and" (长度 3)
- "keep" (长度 4)
- "calm" (长度 4)
- "code" (长度 4)
保持相同长度顺序不变,所以 "keep", "calm", "code" 的顺序不变。
排序结果:
[(4, "on"), (2, "and"), (0, "keep"), (1, "calm"), (3, "code")]
提取排序后的小写单词:
["on", "and", "keep", "calm", "code"]
首字母大写,其余小写:
["On", "and", "keep", "calm", "code"]
合成句子:
"On and keep calm code"
方法比较与优化建议
- 简单排序:直接对原句单词排序,可能因为首字母大写影响稳定排序,导致长度相同单词顺序错乱。
- 统一小写排序:先全部转换成小写,排序后再调整首字母大小写,保证稳定排序效果和正确格式。
- 使用枚举索引:通过给单词附带原索引,实现稳定排序,防止长度相同单词顺序被破坏。
- 首字母大小写处理:排序后将第一个单词首字母大写,保证格式正确。
该方法简单、易懂,时间复杂度为 O(n log n)(排序主导),空间复杂度为 O(n)(存储辅助索引和列表)。
总结
通过对句子单词按长度排序,并保持相同长度单词的原始相对顺序,我们可以利用 Python 的稳定排序特性完成任务。统一单词小写处理可以避免大小写带来的干扰,最后再调整首字母大小写,保证输出格式符合题目要求。