GESP C++2024年12月四级考试编程题(第二题 字符排序)详细解析

📅 发布时间:2026/7/12 10:27:27 👁️ 浏览次数:
GESP C++2024年12月四级考试编程题(第二题 字符排序)详细解析
一、故事开场字母火车排队大赛1、小杨有很多节“小火车车厢”每节车厢上写着一个字符串比如aa ac de2、现在小杨要把这些车厢按某种顺序连接起来变成一列超级长的火车。目标只有一个拼接后的整个字符串必须“从小到大排列”也就是说前一个字符 后一个字符就像排队一样不能有人插队 二、题目到底问什么对于每组数据有 n 个字符串问是否存在一种排列顺序使得拼接后的字符串整体是“非递减”的如果可以输出 1如果不行输出 0✏ 三、思考第一步我们要试多少种排列1、如果用“枚举全排列”n100 的时候……❌ 100! 种排列2、这是天文数字所以我们必须找到一种“聪明的规律”。 四、关键发现1、想一想如果最终拼接后要整体有序那么每个字符串是不是应该 先按字典序排序2、因为C 中 string 的 sort 是按字典序排序的。例如aa ac de3、如果我们把字符串先排序再拼接aaacde是不是天然更容易有序4、这就是本题最重要的突破口 五、完整思考过程我们一步步推理1、第一步读入字符串string s[105];为什么用数组因为最多 100 个字符串。2、第二步排序字符串sort(s, s n);这是 C 的字典序排序。1比如aac bc2排序后aac bc第三步拼接string t ; for (int i 0; i n; i) { t s[i]; }1这里用到了⭐ string 拼接知识t s[i];2表示把 s[i] 加到 t 后面。第四步检查是否整体有序for (int i 1; i t.size(); i) { if (t[i] t[i - 1]) { fl false; break; } }逻辑非常清晰从第二个字符开始和前一个字符比较如果出现“倒退”就失败 六、举例讲解样例11、输入3 aa ac de1排序后aa ac de2拼接aaacde3逐个检查a a a a a c c d d e4全部通过 ✅输出 1❌ 七、举例讲解样例22 aac bc1排序aac bc2拼接aacbc3检查a a a c c b ❌ 出现倒退4失败输出 0 八、参考程序#include iostream #include algorithm using namespace std; int main() { int T; cin T; // 测试组数 while (T--) { int n; cin n; string s[105]; for (int i 0; i n; i) { cin s[i]; } // 字典序排序 sort(s, s n); // 拼接 string t ; for (int i 0; i n; i) { t s[i]; } // 检查是否整体非递减 bool fl true; for (int i 1; i t.size(); i) { if (t[i] t[i - 1]) { fl false; break; } } cout fl \n; } return 0; } 九、本题考察哪些能力这题考察了① string 的基本操作输入字符串比较字符串拼接字符串获取长度 size()② sort 排序sort(s, sn);对 string 数组排序 字典序排序。③ 思维突破从❌ 枚举全排列到✅ 利用排序 验证这就是算法思维升级 十、总结1、这道题用排序代替暴力枚举用拼接构造答案用遍历验证结果。2、理解了这道题✅ string 掌握✅ sort 掌握✅ 枚举思维升级附《GESP四级 string 排序 10道进阶训练题》适合备考GESP C 四级认证 第一题字母火车排队1、 题目小杨有 n 个字符串车厢。他要按字典序排好队然后拼接起来。问拼接后的字符串是否整体非递减2、 思考排序字符串数组拼接检查是否 t[i] t[i-1]3、 程序#include iostream #include algorithm using namespace std; int main(){ int n; cinn; string s[105]; for(int i0;in;i) cins[i]; sort(s,sn); string t; for(int i0;in;i) ts[i]; bool oktrue; for(int i1;it.size();i) if(t[i]t[i-1]) okfalse; coutok; } 第二题最长的字典序字符串1、 题目给你 n 个字符串找字典序最大的那个。2 思路排序后最后一个就是最大。3、 程序sort(s,sn); couts[n-1]; 第三题最短字符串优先1、 题目先按长度排序如果长度相同按字典序排序。2、 需要自定义排序规则if(a.size()!b.size()) return a.size()b.size(); return ab;3、 程序#include iostream #include algorithm using namespace std; bool cmp(string a,string b){ if(a.size()!b.size()) return a.size()b.size(); return ab; } int main(){ int n; cinn; string s[105]; for(int i0;in;i) cins[i]; sort(s,sn,cmp); for(int i0;in;i) couts[i]endl; } 第四题去重排序1、 题目去掉重复字符串再排序。2、 程序sort(s,sn); int k0; for(int i1;in;i){ if(s[i]!s[k]) s[k]s[i]; } for(int i0;ik;i) couts[i]endl; 第五题拼接最小数1、 题目给多个字符串数字拼接后形成最小字典序。例如30 3应该 3032、 排序规则比较 ab 和 ba3、 程序bool cmp(string a,string b){ return ab ba; } 第六题统计每个字符串出现次数1、 题目排序后统计相同字符串数量。2、 程序sort(s,sn); int cnt1; for(int i1;in;i){ if(s[i]s[i-1]) cnt; else{ couts[i-1] cntendl; cnt1; } } couts[n-1] cntendl; 第七题字符串逆序排序1、 题目按字典序从大到小排序。2、 程序sort(s,sn,greaterstring()); 第八题按最后一个字符排序1、 题目比较字符串最后一个字符大小。2、 程序bool cmp(string a,string b){ return a.back()b.back(); } 第九题回文字符串筛选1、 题目找出所有回文字符串并排序。2、回文数筛选bool isPal(string s){ int l0,rs.size()-1; while(lr){ if(s[l]!s[r]) return false; l; r--; } return true; }2、 程序#include iostream #include algorithm #include string using namespace std; bool isPal(string s){ int l0,rs.size()-1; while(lr){ if(s[l]!s[r]) return false; l; r--; } return true; } int main () { int n; cin n; string s[10] ; string ans[10]; int k0; for(int i0;in;i){ cins[i]; if(isPal(s[i])) ans[k]s[i]; } sort(ans1,ansk1); for(int i1;ik;i) cout ans[i] ; return 0; } 第十题字符串拼接后最长递增子序列1、 题目拼接后求最长非递减连续子串长度。2、 程序string t; for(int i0;in;i) ts[i]; int ans1,cnt1; for(int i1;it.size();i){ if(t[i]t[i-1]) cnt; else cnt1; ansmax(ans,cnt); } coutans; 总结1、题目涵盖✅ 字典序排序✅ 自定义排序✅ 字符串拼接✅ 去重技巧✅ 统计技巧✅ 回文判断✅ 拼接比较2、如果能把这 10 题完全掌握GESP四级 string sort 模块基本没问题了。