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

【算法题攻略】模拟

文章目录

  • 一、模拟类算法题的特征
  • 二、习题解析
    • 1. Z 字形变换
    • 2. 外观数列
    • 3. 数青蛙(hard)

一、模拟类算法题的特征

  • 题目描述直观
    模拟题通常直接描述一个现实场景 或 规则系统,要求用代码还原过程。例如棋类游戏规则、物理运动轨迹、自动机行为等。

  • 流程明确
    题目会给出明确的步骤或状态转移规则,例如:
    (1)每一步如何更新数据
    (2)终止条件是什么
    (3)输入输出格式固定

  • 边界条件多
    需要处理大量特殊情况,例如:
    (1)数值溢出
    (2)初始状态和终止状态
    (3)无效输入的处理

二、习题解析

1. Z 字形变换

Z 字形变换

  • 题目描述:

将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。

比如输入字符串为 “PAYPALISHIRING” 行数为 3 时,排列如下:

P A H N A P L S I I G Y I R

之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:“PAHNAPLSIIGYIR”。

请你实现这个将字符串进行指定行数变换的函数:

string convert(string s, int numRows);

示例 1:

  • 输入:s = “PAYPALISHIRING”, numRows = 3
  • 输出:“PAHNAPLSIIGYIR”

示例 2:

  • 输入:s = “PAYPALISHIRING”, numRows = 4
  • 输出:“PINALSIGYAHRPI”
  • 解释:
P I N A L S I G Y A H R P I

示例 3:

  • 输入:s = “A”, numRows = 1
  • 输出:“A”

  • 示例演示:
classSolution{public:stringconvert(string s,intnumRows){if(numRows==1)// 特殊情况处理returns;intcvt=2*numRows-2;string tmp;for(introw=0;row<numRows;row++){if((row==0)||(row==numRows-1))// 处理第一行 和 末尾行的情况{for(inti=row;i<s.size();i+=cvt){tmp+=s[i];}}else// 处理中间行的情况{if(row<s.size()&&numRows>2)tmp+=s[row];inti=cvt;for(;i<s.size();i+=cvt){tmp+=s[i-row];if(i+row<s.size())tmp+=s[i+row];}if(i-row<s.size())tmp+=s[i-row];}}returntmp;}};

2. 外观数列

38. 外观数列

  • 题目描述:

「外观数列」是一个数位字符串序列,由递归公式定义:

  • countAndSay(1) = “1”
  • countAndSay(n) 是 countAndSay(n-1) 的行程长度编码。

行程长度编码(RLE)是一种字符串压缩方法,其工作原理是通过将连续相同字符(重复两次或更多次)替换为字符重复次数(运行长度)和字符的串联。
例如,要压缩字符串 “3322251” ,我们将 “33” 用 “23” 替换,将 “222” 用 “32” 替换,将 “5” 用 “15” 替换并将 “1” 用 “11” 替换。因此压缩后字符串变为 “23321511”。

给定一个整数 n ,返回 外观数列 的第 n 个元素。

示例 1:

  • 输入:n = 4
  • 输出:“1211”
  • 解释:
    countAndSay(1) = “1”
    countAndSay(2) = “1” 的行程长度编码 = “11”
    countAndSay(3) = “11” 的行程长度编码 = “21”
    countAndSay(4) = “21” 的行程长度编码 = “1211”

示例 2:

  • 输入:n = 1
  • 输出:“1”
  • 解释: 这是基本情况。

提示:
- 1 <= n <= 30

  • 示例演示:
classSolution{public:stringcountAndSay(intn){string count_str="1";while(n>1)// 迭代 n 轮生成第 n 个外观数列{string temp;// 使用双指针统计连续且相同的字符个数intleft=0,right=1;while(right<count_str.size()){if(count_str[left]!=count_str[right]){temp+=right-left+'0';temp+=count_str[left];left=right;}right++;}temp+=right-left+'0';temp+=count_str[left];count_str=temp;n--;}returncount_str;}};

3. 数青蛙(hard)

1419. 数青蛙

  • 题目描述:

给你一个字符串 croakOfFrogs,它表示不同青蛙发出的蛙鸣声(字符串 “croak” )的组合。由于同一时间可以有多只青蛙呱呱作响,所以 croakOfFrogs 中会混合多个 “croak” 。

请你返回模拟字符串中所有蛙鸣所需不同青蛙的最少数目。

要想发出蛙鸣 “croak”,青蛙必须 依序 输出 ‘c’, ’r’, ’o’, ’a’, ’k’ 这 5 个字母。如果没有输出全部五个字母,那么它就不会发出声音。如果字符串 croakOfFrogs 不是由若干有效的 “croak” 字符混合而成,请返回 -1 。

示例 1:

  • 输入:croakOfFrogs = “croakcroak”
  • 输出:1
  • 解释:一只青蛙 “呱呱” 两次

示例 2:

  • 输入:croakOfFrogs = “crcoakroak”
  • 输出:2
  • 解释:最少需要两只青蛙,“呱呱” 声用黄色标注 第一只青蛙 “crcoakroak” 第二只青蛙 “crcoakroak

示例 3:

  • 输入:croakOfFrogs = “croakcrook”
  • 输出:-1
  • 解释:给出的字符串不是 “croak” 的有效组合。

提示:

  • 1 <= croakOfFrogs.length <= 10^5
  • 字符串中的字符只有 ‘c’, ‘r’, ‘o’, ‘a’ 或者 ‘k’

  • 代码演示:
classSolution{public:intminNumberOfFrogs(string croakOfFrogs){if(croakOfFrogs.size()%5!=0)return-1;unordered_map<char,int>hash;// 创建哈希表hash['c']=0;hash['r']=0;hash['o']=0;hash['a']=0;hash['k']=0;for(autoit:croakOfFrogs){if(it=='c'){if(hash['k']>0)hash['k']--;hash['c']+=1;}if(it=='r'){if(hash['c']>0){hash['c']--;hash['r']+=1;}elsereturn-1;}if(it=='o'){if(hash['r']>0){hash['r']--;hash['o']+=1;}elsereturn-1;}if(it=='a'){if(hash['o']>0){hash['o']--;hash['a']+=1;}elsereturn-1;}if(it=='k'){if(hash['a']>0){hash['a']--;hash['k']+=1;}elsereturn-1;}}for(autoit:"croa")// 检查哈希表其它位置是否大于0{if(hash[it]>0)return-1;}returnhash['k'];// 返回哈希表中 'k' 字符位置的个数}};

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

相关文章:

  • QEMU理解与分析系列(16):QEMU启动方式分析
  • TK跨境直播网络链路实测分析
  • 电脑投屏工具,将电脑屏幕共享到手机、平板、电脑、智能电视、投影仪等其它设备上!既可以共享整个屏幕,也能单独共享某个应用窗口,可作为提词器使用,或者更多运用场景!
  • 鸿蒙校园水电管理页面:多维度数据可视化与网格布局的最佳实践
  • 《Java 100 天进阶之路》第28篇:Java反射机制原理详解
  • COMSOL电磁超声仿真避坑指南:从‘域不适用’报错到结果收敛的完整调试流程
  • 软件测试笔记【黑盒测试篇】:基于需求、面向功能
  • Taotoken多模型聚合在批量内容生成任务中的稳定性观察
  • 【Java+AI】Java正在悄然“杀死“Python的AI霸权——虚拟线程与GraalVM如何重写企业级AI推理规则
  • DeepSeek大模型推理显存爆满?揭秘vLLM+FlashAttention下GPU显存占用突增217%的真实根因
  • 杰理微蓝牙芯片AC696系列入门
  • 【正式版上线】Open Claw 2.7.5 桌面端一键安装部署教程
  • 掌握Linux网络设计中的WebSocket服务器
  • 拒绝扁平化噩梦!VLAN 三大核心优势深度拆解:从广播风暴到零信任安全架构的实战进化论
  • 小佩宠物饮水机拆机分析报告
  • 从宿舍查寝神器到企业考勤解决方案:栎偲考勤神器的技术落地实践
  • 基于 BCR Arm 的智能积木抓取与堆叠,换层仿真
  • 2026年SQL性能优化实战:从“规则背诵”到“原理驱动”的思维跃迁
  • 部门文件同步协作难?企业网盘选型必须要懂的 3 个核心标准
  • 我开发了一个 AI 表单填写 Chrome 插件:AutoFormX,提升 Web 测试和表单联调效率
  • 提示词工程(下):思维链、自我一致与 Cursor 规则
  • 操作系统概述(4)--操作系统运行机制(1):处理机双重模式与中断
  • Microchip安卓配件开发平台:MCU与安卓系统高效协同实战指南
  • 拓璞数控港股上市:市值142亿港元 年营收5.8亿,净利163万
  • 做精密阻抗分析仪踩过屏的坑,终于摸透这四个选型标准
  • ITO靶材成分均匀性(In/Sn比)控制技术排名
  • 论文查重vs查AI到底差在哪?AIGC检测原理拆解,AI率轻松降20%
  • 网安学习第23天 PHP安全——RCE漏洞
  • C#如何优雅处理引用类型的深拷贝 (十一)
  • 项目——基于C/S架构的文件传输系统平台 (2)——重构