1. 身份证排序算法解析
这道蓝桥杯算法题要求我们对一组身份证号码进行特定规则的排序。作为参加过多次算法竞赛的老手,我发现这类字符串处理题目在比赛中出现频率很高,掌握核心思路能帮我们快速拿分。
先看题目核心需求:对N个18位身份证号码进行排序,优先按出生日期降序排列,出生日期相同的则按身份证完整字符串降序排列。身份证号码的出生日期位于第7-14位(从0开始计数则是6-13位),这也是我们处理的关键。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. C++实现方案详解
2.1 数据结构选择
我选择用string数组存储身份证号码,这是最直观的方案:
cpp复制string s[100010]; // 题目数据量在1e5范围内
为什么不使用vector?在已知最大数据量的竞赛场景中,预先分配数组更节省时间和空间。实测显示,数组访问比vector略快,这对时间敏感的算法题很关键。
2.2 核心比较函数
排序的关键在于自定义比较函数cmp:
cpp复制bool cmp(string a, string b) {
string a1 = a.substr(6,8); // 提取a的出生日期
string b1 = b.substr(6,8); // 提取b的出生日期
if(a1 != b1) {
return a1 > b1; // 日期降序
} else {
return a > b; // 字符串降序
}
}
这里有几个重要细节:
- substr(6,8)表示从第6位开始取8个字符(即YYYYMMDD)
- 字符串比较本身是按字典序,正好符合日期比较需求
- 二级排序直接比较完整字符串,简单高效
2.3 主函数实现
主函数的处理流程很标准:
cpp复制int main() {
int n;
cin >> n;
for(int i = 0; i < n; i++) {
cin >> s[i];
}
sort(s, s + n, cmp); // 自定义排序
for(int i = 0; i < n; i++) {
cout << s[i] << endl;
