《算法题讲解指南:优选算法-模拟》--41.外观数列,42.数青蛙

《算法题讲解指南:优选算法-模拟》--41.外观数列,42.数青蛙

🔥小叶-duck个人主页

❄️个人专栏《Data-Structure-Learning》

《C++入门到进阶&自我学习过程记录》《算法题讲解指南》--从优选到贪心

未择之路,不须回头
已择之路,纵是荆棘遍野,亦作花海遨游


目录

41.外观数列

题目链接:

题目描述:

题目示例:

解法(模拟):

算法思路:

C++算法代码:

算法总结及流程解析:

42.数青蛙

题目链接:

题目描述:

题目示例:

解法(模拟+分情况讨论):

算法思路:

C++算法代码:

算法总结及流程解析:

结束语


41.外观数列

题目链接:

38. 外观数列 - 力扣(LeetCode)

题目描述:

题目示例:

解法(模拟):

算法思路:

      所谓【外观数列】,其中只是依次统计字符串中连续且相同的字符的个数。依据题意,依次模拟即可。

C++算法代码:

class Solution { public: // string func(string s) // { // string ret; // int left = 0, right = 0, len = 0; // while(right < s.size()) // { // if(s[right] == s[left]) // { // right++; // } // else // { // len = right - left; // ret += to_string(len); // ret += s[left]; // left = right; // } // } // len = right - left; // ret += to_string(len); // ret += s[left]; // return ret; // } string countAndSay(int n) { // string ret = "1"; // while(--n) // { // ret = func(ret); // } // return ret; string ret = "1"; while(--n) { string s; //巧妙用一下双指针来获取相同数字的长度 int left = 0, right = 0, len = 0; while(right < ret.size()) { if(ret[right] == ret[left]) { right++; } else { len = right - left; s += to_string(len);//to_string可以将数字转换出字符 s += ret[left]; left = right; } } len = right - left; s += to_string(len); s += ret[left]; ret = s; } return ret; } };

算法总结及流程解析:

42.数青蛙

题目链接:

1419. 数青蛙 - 力扣(LeetCode)

题目描述:

题目示例:

解法(模拟+分情况讨论):

算法思路:

      模拟青蛙的叫声。

  • 当遇到 'r'  'o'  'a'  'k' 这四个字符的时候,我们要去看看每一个字符对应的前驱字符,有没有青蛙叫出来。如果有青蛙叫出来,那么就让这个青蛙接下来喊出这个字符;如果没有,直接返回 -1;
  • 当遇到 ‘c’ 这个字符的时候,我们去看看 ‘k’ 这个字符有没有青蛙叫出来。如果有,就让这个青蛙继续去 ‘c’ 这个字符;如果没有的话,就重新整一个青蛙出来

C++算法代码:

class Solution { public: int minNumberOfFrogs(string croakOfFrogs) { // //暴力算法:模拟 // //通过一个数组hash模拟存放croak这五个字母 // int n = croakOfFrogs.size(); // vector<int> hash(5, 0); // for(int i = 0; i < n; i++) // { // if(croakOfFrogs[i] == 'c') // { // if(hash[4]) // { // hash[4]--; // } // hash[0]++; // } // else if(croakOfFrogs[i] == 'r') // { // if(hash[0]-- == 0) // { // return -1; // } // hash[1]++; // } // else if(croakOfFrogs[i] == 'o') // { // if(hash[1]-- == 0) // { // return -1; // } // hash[2]++; // } // else if(croakOfFrogs[i] == 'a') // { // if(hash[2]-- == 0) // { // return -1; // } // hash[3]++; // } // else // { // if(hash[3]-- == 0) // { // return -1; // } // hash[4]++; // } // } // for(int i = 0; i < hash.size() - 1; i++) // { // if(hash[i] != 0) // { // return -1; // } // } // return hash[4]; //代码优化:使用一个哈希表存放croak在数组hash中对应的下标,便于快速访问 //就可以不用像上面那样用五个if else来分别判断 string s = "croak"; int n = s.size(); vector<int> hash(n, 0);//用数组模拟哈希表hash来存放croak几个字符 unordered_map<char, int> index; //存放字符所对应在数组hash中的下标 for(int i = 0; i < n; i++) { index[s[i]] = i; } for(int i = 0; i < croakOfFrogs.size(); i++) { int x = index[croakOfFrogs[i]]; //获取到当前字符的下标 if(x != 0) //当前字符为r、o、a、k { if(hash[x - 1]-- == 0) { return -1; } hash[x]++; } else//当前字符为c { if(hash[n - 1]) { hash[n - 1]--; } hash[x]++; } } //如果遍历完字符串后数组hash中除了最后一位k有值, //还有其他字符也有值,则说明有传声还没有完成,则返回-1 for(int i = 0; i < n - 1; i++) { if(hash[i] != 0) { return -1; } } return hash[n - 1]; } };

算法总结及流程解析:

结束语

      到此,41.外观数列,42.数青蛙 这两道算法题就讲解完了。外观数列:模拟统计连续相同字符的个数并生成新字符串。通过双指针计数,迭代n-1次得到结果。数青蛙:通过模拟青蛙叫声过程,分析字符序列croak的匹配逻辑。算法使用哈希表记录字符位置,并动态维护各阶段字符计数:当遇到c时复用已完成k的青蛙或新增青蛙;其他字符则需前驱字符存在才能继续。最后检查未完成序列的青蛙数量。希望大家能有所收获!

Read more

基于C++Qt实现邮政客户投诉工单处理系统[2026-01-07]

基于C++Qt实现邮政客户投诉工单处理系统[2026-01-07]

基于C++Qt实现邮政客户投诉工单处理系统[2026-01-07] 项目介绍 邮政客户投诉工单处理系统是一个基于Qt框架开发的信息管理系统,主要用于处理邮政客户的投诉工单,实现了投诉工单的创建、处理、审核、统计等全流程管理。系统支持多角色权限管理,为不同身份的用户提供不同的功能界面。 技术栈 * 开发框架:Qt 5.x * 编程语言:C++ * 数据库:SQLite * UI设计:Qt Designer 功能模块 1. 用户管理 * 用户注册、登录、密码找回 * 用户信息管理 * 多角色权限控制(超级管理员、管理员、普通用户) * 普通用户角色细分(客户、客服、主管) 2. 投诉工单管理 * 投诉工单创建 * 投诉工单处理 * 投诉工单审核 * 投诉工单查询 * 投诉工单状态跟踪 3. 工单报表 * 工单状态统计 * 月度投诉统计

By Ne0inhk

C++ 全栈学习路线指南:从入门到精通

🚀 C++ 全栈学习路线指南:从入门到精通 摘要:本文档提供了一份系统而全面的 C++ 学习路线图。内容涵盖从基础语法、面向对象编程、核心内存管理,到高级模板元编程、现代 C++ 特性(C++11/14/17/20)、软件工程设计模式以及实战开发流程。旨在帮助开发者构建坚实的理论基础,掌握工业级开发技能,并紧跟技术前沿。 📑 目录 1. C++ 基础 2. 面向对象编程(OOP) 3. C++ 核心编程 4. 高级主题 5. 软件开发实践 6. 软件设计 7. 实战经验 8. 拓展学习 9. 学习建议 10. 未来展望 11. 学习资源 12.

By Ne0inhk
Microsoft Visual C++ 运行库安装教程(2025 最新版全版本修复指南)

Microsoft Visual C++ 运行库安装教程(2025 最新版全版本修复指南)

前言 在使用大型软件、开发工程项目或玩 3A 游戏时,很多人都遇到过这样的报错: “缺少 msvcp140.dll” “无法继续执行代码,因为系统找不到 vcruntime140_1.dll” “程序无法启动,因为计算机中丢失了 MSVCR100.dll” 这些提示看似复杂,其实本质是 Microsoft Visual C++ 运行库(VC++ Redistributable)缺失或损坏 所致。 本文将带来 2025 年最新版 Microsoft Visual C++ 运行库安装教程,无论你是游戏玩家、开发者还是普通用户,都能找到最合适的解决方案。内容涵盖: * 一键修复方法(适合新手,快速解决 DLL 报错) * 手动下载安装方案(适合专业或开发用途) * 常见 DLL 报错与完整修复思路 * 系统维护与预防技巧

By Ne0inhk
C++学习之旅【C++伸展树介绍以及红黑树的实现】

C++学习之旅【C++伸展树介绍以及红黑树的实现】

🔥承渊政道:个人主页 ❄️个人专栏: 《C语言基础语法知识》《数据结构与算法》 《C++知识内容》《Linux系统知识》 ✨逆境不吐心中苦,顺境不忘来时路!🎬 博主简介: 引言:前篇文章,小编已经介绍了关于C++AVL树的实现!相信大家应该有所收获!接下来我将带领大家继续深入学习C++的相关内容!本篇文章着重介绍关于C++伸展树介绍以及红黑树的实现!伸展树与红黑树是两类极具代表性的BBST,且在工程实践中各有不可替代的价值:伸展树摒弃了"严格平衡”的执念,通过“伸展”操作将最近访问的节点移至根节点,利用“局部性原理”优化频繁访问的场景,实现均摊O(logn)的时间复杂度,适合缓存、热点数据查询等场景;红黑树则通过给节点着色并遵守严格的颜色规则,确保树的最长路径不超过最短路径的两倍,以 “弱平衡” 换稳定的最坏O(logn)性能,是C++ STL 中 std::map、std:

By Ne0inhk