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

算法刷题|模拟思想高频题全解(Java版)

算法刷题|模拟思想高频题全解(Java版)

在算法面试与笔试中,模拟是最直观、最容易上手的解题思想——题目怎么描述,代码就怎么实现。不需要复杂数据结构,不需要高深算法模板,只要严格还原题目流程,就能稳稳拿分。


一、什么是模拟算法?

模拟算法的核心:

严格按照题目要求,一步一步复现过程

通用解题步骤:

  1. 读懂题意,梳理操作流程

  2. 确定遍历顺序与边界条件

  3. 逐一遍历,按规则处理元素

  4. 处理特殊情况(首尾、空值、越界)

适用场景:字符串处理、游戏场景、时间计算、数列生成、流程类题目。


二、经典模拟题(Java 实现)

1. 替换所有的问号(1576. Easy)

题目:将字符串中的?替换成小写字母,使结果没有连续重复字符

思路

遍历字符串,遇到?就从a-z尝试替换,只要不和左右字符相同即可。

class Solution { public String modifyString(String ss) { char[] s = ss.toCharArray(); int n = s.length; for (int i = 0; i < n; i++) { if (s[i] == '?') { // 从a到z试 for (char ch = 'a'; ch <= 'z'; ch++) { boolean leftOk = (i == 0) || (ch != s[i - 1]); boolean rightOk = (i == n - 1) || (ch != s[i + 1]); if (leftOk && rightOk) { s[i] = ch; break; } } } } return String.valueOf(s); } }

2. 提莫攻击(495. Easy)

题目:提莫攻击中毒 duration 秒,重复攻击会重置时间,求总中毒秒数。

思路

  • 相邻攻击时间差 ≥ duration:加完整时间

  • 否则加时间差

  • 最后一次攻击一定能持续完整 duration

class Solution { public int findPoisonedDuration(int[] timeSeries, int duration) { int res = 0; for (int i = 1; i < timeSeries.length; i++) { int diff = timeSeries[i] - timeSeries[i - 1]; res += Math.min(diff, duration); } // 最后一击 return res + duration; } }

3. N 字形变换(6. Medium)

题目:把字符串按指定行数排成 N 字形,再按行读取。

思路

找周期规律:

周期长度 =2 * numRows - 2

  • 第一行、最后一行:按周期取

  • 中间行:每个周期取两个对称位置

class Solution { public String convert(String s, int numRows) { if (numRows == 1) return s; int n = s.length(); int cycle = 2 * numRows - 2; StringBuilder sb = new StringBuilder(); // 第一行 for (int i = 0; i < n; i += cycle) { sb.append(s.charAt(i)); } // 中间行 for (int k = 1; k < numRows - 1; k++) { for (int i = k, j = cycle - k; i < n || j < n; i += cycle, j += cycle) { if (i < n) sb.append(s.charAt(i)); if (j < n) sb.append(s.charAt(j)); } } // 最后一行 for (int i = numRows - 1; i < n; i += cycle) { sb.append(s.charAt(i)); } return sb.toString(); } }

4. 外观数列(38. Medium)

题目

1 → 11 → 21 → 1211 → 111221

每一项是对前一项的描述。

思路

双指针统计连续相同字符:个数 + 字符

class Solution { public String countAndSay(int n) { String res = "1"; // 迭代n-1次 for (int i = 1; i < n; i++) { StringBuilder tmp = new StringBuilder(); int len = res.length(); int left = 0; while (left < len) { int right = left; while (right < len && res.charAt(left) == res.charAt(right)) { right++; } tmp.append(right - left).append(res.charAt(left)); left = right; } res = tmp.toString(); } return res; } }

5. 数青蛙(1419. Medium)

题目

字符串由croak混合组成,求最少需要多少只青蛙,无效返回 -1。

思路

  • 青蛙必须按顺序:c → r → o → a → k

  • 遇到c:有叫完的青蛙就复用,没有就新增

  • 遇到其他字符:必须有前驱,否则无效

  • 最后非k阶段有剩余,说明不合法

class Solution { public int minNumberOfFrogs(String croakOfFrogs) { String croak = "croak"; int n = croak.length(); int[] cnt = new int[n]; // 建立字符到下标的映射 int[] index = new int[128]; for (int i = 0; i < n; i++) { index[croak.charAt(i)] = i; } for (char ch : croakOfFrogs.toCharArray()) { int i = index[ch]; if (i == 0) { // c if (cnt[4] > 0) cnt[4]--; cnt[0]++; } else { if (cnt[i - 1] == 0) return -1; cnt[i - 1]--; cnt[i]++; } } // 前面不能有剩余 for (int i = 0; i < 4; i++) { if (cnt[i] != 0) return -1; } return cnt[4]; } }

三、模拟题刷题总结(必看)

  1. 先画流程再写代码:把题目步骤写出来,代码逐行对应

  2. 边界优先处理:首尾、空串、长度为1

  3. 双指针是神器:统计连续字符、区间扫描

  4. 场景题抓规则:提莫抓“重置”、数青蛙抓“顺序”

  5. Java 技巧

    • 字符串转数组修改更方便

    • StringBuilder高效拼接

    • 数组模拟哈希比Map更快

模拟题是算法入门最友好的题型,代码直观、逻辑清晰、面试高频。吃透这5道题,大部分模拟题你都能轻松秒杀!

http://www.jsqmd.com/news/477119/

相关文章:

  • 国产算力实战:在昇腾910B上高效部署Qwen3-Embedding-8B向量模型
  • GNU Mailman 2.1.39目录遍历漏洞实战复现:从POC到修复方案
  • 探讨平舆县驾校培训定制,哪家公司比较靠谱 - mypinpai
  • Android 实战:基于Zxing定制竖屏前置摄像头二维码扫描与生成方案
  • 腾讯云服务器地域与可用区终极指南:2025年最新选择策略与城市分布详解
  • 蛋白质组学新手必看:5分钟搞懂质谱仪的工作原理与核心部件
  • 手机影像技术迈入“光学质变“时代:从多摄堆叠到系统化重塑
  • 元不凡元宵馅料精品定制性价比高不高? - 工业设备
  • 7个终极安全技巧:防止sd命令意外修改文件的完整指南
  • 收藏!开发人最近太难了!AI时代不转型真的要被淘汰
  • 保姆级教程:用PHPStudy本地环境加速Arduino ESP8266依赖下载(避坑指南)
  • Docker一键部署思源笔记:打造私有化知识库并穿透内网访问
  • RocketMQ踩坑实录:Producer连不上Broker的5种常见原因及快速修复
  • OpenWrt网络调试必备:nslookup和dig命令的5个实战技巧
  • Kubernetes游戏服务器管理终极指南:Agones核心概念GameServer、Fleet和Allocation深度解析
  • 【Wi-Fi】智能家居低功耗实战:STA休眠模式与DTIM唤醒机制深度解析
  • 掌握 Agent Skills:轻松扩展 AI 能力,小白也能玩转大模型(收藏备用)
  • 网安人必看:金三银四跳槽季,10个核心岗位发展方向与技术底气
  • 终极指南:Prisma客户端生成器的完整使用教程与最佳实践
  • 手把手教你用4G模块+花生壳实现远程控制单片机(附完整AT指令集)
  • 5分钟搞定:用Python+OverPy批量下载OpenStreetMap城市路网(附完整代码)
  • 深入解析X509证书中的Subject Public Key Info:从ECC到RSA的密钥编码实践
  • 终极xhyve设备仿真指南:VirtIO、AHCI与PCI总线深度解析
  • 人才缺口300万+,薪资持续飙升,女生学网络安全好就业吗?网络安全就业薪资多少学网络安全好找工作吗?
  • 如何快速开发Qiskit扩展:自定义原语与转译器全攻略
  • 《PMBOK® 指南》第八版深度解读:6 大原则如何重塑项目管理实践
  • c#笔记之类的继承
  • 【windows】如何通过防火墙配置实现ICMP协议通信(允许ping)
  • CMOS技术解析:从基础原理到现代应用
  • 如何用boto CloudFormation快速构建AWS基础设施:Python开发者的终极指南