跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava算法

Java 算法:模拟类题目实战

通过四个经典 Java 算法题讲解模拟思想。包括替换字符串中的问号避免连续重复字符、计算提莫攻击中毒时长、Z 字形变换的字符重排以及外观数列的递归生成。重点在于掌握如何根据规则模拟过程,处理边界条件,利用 StringBuilder 优化字符串拼接,以及双指针或周期规律的应用。适合初学者理解模拟类算法的实现细节。

BackendPro发布于 2026/3/26更新于 2026/10/26129 浏览

练习一:替换所有的问号

[1576. 替换所有的问号]

class Solution { public String modifyString(String s) { char[] ch = s.toCharArray(); for(int i=0;i<ch.length;i++){ if(ch[i] == '?'){ for(char tmp = 'a';tmp<='z';tmp++){ if((i == 0||tmp!=ch[i-1])&&(i ==ch.length-1||tmp!=ch[i+1])){ ch[i] = tmp; break; } } } } return String.valueOf(ch); } }

练习二:提莫攻击

[495. 提莫攻击]

class Solution { public int findPoisonedDuration(int[] nums, int duration) { int ret = 0; for(int i=0;i<nums.length;i++){ if((i == nums.length-1)||(nums[i+1]-nums[i]>=duration)){ ret+=duration; }else{ ret+=nums[i+1]-nums[i]; } } return ret; } }

练习三:Z 字形变换

[6. Z 字形变换]

class Solution { public String convert(String s, int numRows) { char[] ch = s.toCharArray(); if(numRows == 1||s.length()<=numRows){ return s; } StringBuilder sb = new StringBuilder(); int d = 2*numRows-2; for(int i = 0;i<numRows;i++){ int k = 0; while(i+k*d<ch.length){ if(i == 0||i == numRows-1){ sb.append(ch[i+k*d]); }else{ sb.append(ch[i+k*d]); if((d-i+k*d)<s.length()){ sb.append(ch[d-i+k*d]); } } k++; } } return sb.toString(); } }

算法原理

  1. 如果行数为 1,或者字符串长度小于等于行数,则直接返回字符串
  2. 模拟图解逻辑:
    • 第 0 行和最后一行:在行数的基础上每个周期加上一个公差 (d = 2n-2)
    • 其余行:两个元素为一组,每个周期加上一个公差,例如第 i 行,周期为 0,两个元素的下标表示为:(i, d-i);(其中 d 为公差)

细节问题

  1. 周期次数放在 if-else 判断外,以免产生死循环
  2. String 类型为不可变类型,使用时需要配合 StringBuilder 和 char[] 类型来使用

练习四:外观数列

[38. 外观数列]

class Solution { public String countAndSay(int n) { String s = "1"; for (int i = 2; i <= n; i++) { char[] ch = s.toCharArray(); StringBuilder sb = new StringBuilder(); int left = 0, right = 0; while (right < ch.length) { if (ch[left] == ch[right]) { right++; } else { sb.append(right - left).append(ch[left]); left = right; } } sb.append(right - left).append(ch[left]); s = sb.toString(); } return s; } }

目录

  1. 练习一:替换所有的问号
  2. 练习二:提莫攻击
  3. 练习三:Z 字形变换
  4. 算法原理
  5. 细节问题
  6. 练习四:外观数列

更多推荐文章

查看全部
  • 使用 ZeroNews 远程管理 OpenClaw Gateway Dashboard
  • Spring AI ImageModel 集成 OpenAI DALL-E 图像生成指南
  • GitHub Copilot 安装与使用指南
  • Python 基础语法完全指南:变量、数据类型与运算符
  • AI 入门指南:常见术语解释与核心误区澄清
  • Python 爬虫实战:爬取苏宁商品评论(好评与差评)
  • 在 IDEA 里改 Gitee 远程仓库的做法
  • 博士求职复盘:华为、字节与 DeepSeek 的抉择与思考
  • Z-Image-Turbo 与 Midjourney 本地部署和云端服务对比
  • VSCode 关闭 Copilot 代码 AI 补全
  • 【Js逆向 python】Web JS 逆向全体系详细解释
  • Qt C++ 实战:Modbus RTU 协议详解及主站实现
  • 零基础学习网络安全指南:职业方向与技能路径
  • Mac 下使用 Homebrew 安装 NVM 管理 Node.js 版本及 zsh 配置
  • 用豆包打造专属 Python 智能管家解决编程难题
  • Spring Boot + Vue 前后端接口交互全流程详解
  • Flask 集成 flask-admin 后台及 flask-login 权限管理
  • Java 接口开发核心注解与规范
  • RAG 系统知识投毒攻击研究:One Shot Dominance 论文解读
  • 基于 Rokid AR 眼镜的 Android 喝水提醒应用开发

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online