洛谷P5742Python
时间: 2025-04-06 11:03:55 浏览: 28
### 关于洛谷 P5742 的 Python 实现与解题思路
#### 问题描述
题目要求计算一个字符串中的字符频率并按照特定顺序输出。此问题的核心在于统计字符频次以及对结果进行排序。
---
#### 数据结构的选择
为了高效处理字符频率统计,可以使用字典 `dict` 来存储每个字符及其对应的出现次数[^1]。具体来说,键为字符本身,值为其出现的次数。
```python
frequency = {}
for char in input_string:
if char not in frequency:
frequency[char] = 0
frequency[char] += 1
```
上述代码片段展示了如何遍历输入字符串并将字符与其计数关联起来。
---
#### 排序逻辑
完成字符频率统计后,需根据题目需求对结果进行排序。通常情况下,先依据频率降序排列,再按字符 ASCII 值升序排列。这种复合排序可以通过列表推导式结合内置函数 `sorted()` 完成:
```python
result = sorted(frequency.items(), key=lambda x: (-x[1], x[0]))
```
此处 `-x[1]` 表示按频率降序排列,而 `x[0]` 则表示按字符本身的 ASCII 值升序排列[^2]。
---
#### 输出格式化
最后一步是将排序后的结果转换为目标输出形式。假设目标输出是一个由字符和其对应频率组成的二维数组,则可采用如下方式构建最终输出:
```python
output = []
for item in result:
output.append([item[0], item[1]])
print(output)
```
以上代码实现了从排序结果到指定格式输出的转化过程[^3]。
---
#### 完整代码示例
以下是综合上述各部分的一个完整解决方案:
```python
from collections import Counter
def solve():
input_string = input().strip()
# 使用Counter简化频率统计
frequency = dict(Counter(input_string))
# 复合排序:优先按频率降序,其次按字符ASCII值升序
result = sorted(frequency.items(), key=lambda x: (-x[1], x[0]))
# 构建输出格式
output = [[char, freq] for char, freq in result]
print(output)
solve()
```
该程序利用了标准库模块 `collections.Counter` 进一步优化了字符频率统计的过程[^4]。
---
#### 时间复杂度分析
整个算法的时间复杂度主要取决于两个方面:
1. 字符串扫描阶段用于建立频率表,时间复杂度为 \(O(N)\),其中 \(N\) 是字符串长度。
2. 对频率表项进行排序的操作,最坏情况下的时间复杂度为 \(O(M \log M)\),这里 \(M\) 是不同字符的数量。
因此总体时间复杂度大约为 \(O(N + M \log M)\)[^5]。
---
阅读全文
相关推荐
















