当前位置: 首页 > news >正文

我爱学算法之—— 模拟(下) - 教程

一、外观数列

题目解析

在这里插入图片描述

对于这道题,给定一个n,要求我们返回外观数列的第n个元素。

所谓外观数列,countAndSay(n)countAndSay(n-1)行程长度编码。

而行程长度编码,简单来说就是将一个字符串中连续相同字符,修改成出现的次数+字符。

例如:字符串"21"2出现了一次,就变成了12,而1出现了一次,就变成了11。最终字符串就变成了1211

算法思路

了解了题目大概要求,现在来看如何实现:

给定一个n,要求返回第n个外观数列,也就是对字符串"1",进行n-1次行程编码。

所以,我们只需要实现一个字符串行程编码(也就是统计一个字符串中字符出现的次数,然后再跟上字符拼接上一个新的字符串即可);

然后进行n-1次行程编码,就可以获得最终结果。

代码实现

class Solution {
public:
string countAndSay(int n) {
string ret = "1";
for (int i = 1; i < n; i++) // 进行n-1次编码
{
int l = 0, r = 0;
int sz = ret.size();
string tmp;
while (r < sz) {
while (r < sz && ret[r] == ret[l])
r++;
// 字符串拼接
tmp += (to_string(r - l) + ret[l]);
l = r;
}
ret = tmp;
}
return ret;
}
};

二、数青蛙

题目解析

在这里插入图片描述

对于这道题,给定一个字符串croakOfFrogs,其中只包含croak

青蛙要像发送蛙鸣,就必须按照croak的顺序,少一个字母都不能发送蛙鸣。

题目要求我们根据字符串croakFrogs中,所有蛙鸣所需要青蛙的最少数目。

注意:题目中明确说明,croakOfFrogs中不是由若干个有效的croak字符组成,就返回-1(也就是说,在croakOfFrogs中。如果存在字符没有按照croak的顺序,或者缺少某一个字符,就返回-1

算法思路

了解了这道题是什么意思,那如何求解呢?

思路:

对于这道题,遍历croakOfFrogs字符串肯定是必不可少的;

在遍历croakOfFrogs字符串的过程中,我们要判断当前字符串是否是满足条件的(按照croak顺序),还要统计需要青蛙的最少数量。

所以,这里我们就可以使用一个hash表,hash表中统计的是:当前喊到了该字符的数量。

在遍历到i位置时:

在这里插入图片描述

描述完了整个过程,接下来就是将这个过程转换成代码:

首先,创建hash表(这里使用vector<int>模拟hash表)。初始化hash

在遍历字符串之前,这里可以再创建一个unordered_map(也就是hash表)index,其中存储字符和对应的下标。

然后,遍历字符串croakOfFrogs"croak"字符串的长度为n

遍历完字符串croakOfFrogs后,再遍历hash表(除'k'以外所有元素),如果存在值>0的就返回-1

最后,返回hash[n-1]即可。

代码实现

class Solution {
public:
int minNumberOfFrogs(string croakOfFrogs) {
string str = "croak";
int n = str.size();
vector<int> hash(n);unordered_map<char, int> index;for (int i = 0; i < n; i++)index.insert({str[i], i});for (auto& e : croakOfFrogs) {if (e == 'c') {if (hash[n - 1] > 0)hash[n - 1]--;hash[0]++;} else {int i = index[e];if (hash[i - 1] == 0)return -1;hash[i]++;hash[i - 1]--;}}for (int i = 0; i < n - 1; i++) {if (hash[i] > 0)return -1;}return hash[n - 1];}};

本篇文章到这里就结束了,感谢支持
我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=2oul0hvapjsws

http://www.zskr.cn/news/29271.html

相关文章:

  • 完整教程:Torch-Rechub学习笔记-task3
  • 【Python爬虫】反爬虫入门与基础(一) - 教程
  • Day3综合案例一:个人简介
  • 后缀数组 SA
  • 边缘计算与AI:移动端设计软件的实时性能突破 - 教程
  • 字符串模式匹配算法 KMP
  • Flink编程模型 - 详解
  • 工业4.0下的边缘存储设计:材料就地处理,响应更快更安全
  • 服务器关机用halt、poweroff还是shutdown -h now?一文帮你说明
  • Min25 筛
  • 完整教程:微软2025教育AI报告:教育群体采用AI的比例显著提升
  • 康拓展开
  • git回滚代码
  • 离散对数 bsgs 与 exbsgs
  • 【LTDC】LTDC 简介
  • 分类器案例 - -一叶知秋
  • 最大流
  • 最长路(topsort+DP算法)
  • 缩点(Tarjan 算法)
  • 常见概念
  • CNCF项目记录2025-10
  • 代理
  • 双碳目标下,MyEMS 为何成为制造企业的 “刚需工具”?
  • 树上路径交
  • 点分治 / 树的重心
  • 树论大封装(直径+重心+中心)
  • 书评-谋杀黄昏
  • 徐州信息技术服务管理体系认证渠道口碑榜:聚焦机构资质、服务案例及合规性评估
  • 完整教程:【汽车篇】AI深度学习在汽车零部件外观检测——铝铸件中的应用
  • 附加数据文件失败:操作系统错误 5:“5(拒绝访问。)”。 CREATE DATABASE 失败。无法创建列出的某些文件名