1. 基础+模拟篇:从排序到字符串处理
1.1 排序与数组操作实战
1.1.1 洛谷P1059明明的随机数
这道题考察的是数组去重和排序的基础操作。题目要求对输入的随机数进行去重并按升序输出,看似简单但暗藏几个关键点:
方法一采用手动去重的方式,在排序后遍历数组,通过比较当前元素与前一个元素是否相同来判断是否重复。这种方法的优势在于:
- 直观展示了去重的底层逻辑
- 适合教学场景,便于理解去重原理
- 时间复杂度O(nlogn)来自排序,去重部分O(n)
方法二则使用了STL的unique函数,这是更工程化的做法:
- unique会将相邻的重复元素移动到容器末尾
- 返回的是去重后的新逻辑结尾迭代器
- 需要先排序才能正确去重(与sort配合使用)
注意:unique并不会真正删除元素,只是改变了元素的逻辑位置。实际开发中常配合erase使用:
a.erase(unique(a.begin(), a.end()), a.end())
1.1.2 洛谷P1068分数线划定
这道题结合了结构体排序和条件筛选,是典型的竞赛排名问题。解题时需要特别注意:
-
自定义比较函数cmp的设计:
- 先按分数降序
- 分数相同按准考证号升序
- 这种多条件排序是竞赛常见考点
-
分数线计算细节:
- 面试人数m的150%(即m*1.5)
- 需要向下取整,但题目描述中m*3/2的写法更高效
- 最后要统计所有同分考生,可能超过计划人数
-
输出格式要求:
- 先输出分数线和实际人数
- 再输出所有达标考生信息
- 保持原始排序结果
1.2 字符串处理技巧
1.2.1 洛谷P1308统计单词数
这道字符串题目有几个易错点需要特别注意:
-
大小写统一处理:
- 使用tolower/toupper统一转换
- 注意不要修改原始输入字符串(使用auto&)
-
单词分割逻辑:
- 需要跳过连续空格
- 识别单词边界(非空格字符序列)
- 记录单词起始位置
-
边界条件:
- 目标单词在开头/结尾的情况
- 输入为空字符串的处理
- 多个连续空格的分隔
实战技巧:在字符串遍历时
