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

模拟算法实战:替换问号、提莫攻击、N 字形变换、外观数列与数青蛙

综述由AI生成汇总了五道模拟算法题的解法。包含 LC1576 替换问号,通过遍历检查前后字符避免重复;LC495 提莫攻击,计算攻击间隔累加中毒时长;LC6 N 字形变换,利用周期规律按行重组字符串;LC38 外观数列,双指针统计连续字符生成下一项;LC1419 数青蛙,维护叫声状态数组判断最小青蛙数。所有代码基于 Java 实现,注重边界条件与逻辑优化。

山野诗人发布于 2026/3/22更新于 2026/5/2125 浏览
模拟算法实战:替换问号、提莫攻击、N 字形变换、外观数列与数青蛙

1. 替换所有的问号(LC1576)

题目描述

解题思路

按照题目要求,双层循环,外层遍历字符串;内层从 a 到 z 依次尝试,与前后不等则填入。

代码实现

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

2. 提莫攻击(LC495)

题目描述

解题思路

计算两次'受到攻击'之间的差值 x:

  • x >= d,则 ret += d
  • x < d,则 ret += x

最后要加上一个 d,表示最后一次'攻击'的时间。

代码实现

public int findPoisonedDuration(int[] timeSeries, int duration) {
    int ret = 0;
    for (int i = 1; i < timeSeries.length; i++) {
        int x = timeSeries[i] - timeSeries[i - 1];
        ret += (x >= duration) ? duration : x;
    }
    ret += duration;
    return ret;
}

3. N 字形变换(LC6)

题目描述

解题思路

  • 解法二:依据模拟过程找规律,把字符的下标模拟到矩阵中:
    • 第 0 行:公差就是一个周期中字符个数 d = n + n - 2 = 2n - 2
      • 0 -> 0+d -> 0+2d -> 0+3d -> …-> 0+kd
    • 第 i 行:一个周期内有两个元素
      • i -> i+d -> i+2d -> … -> i+kd
      • d - i -> d - i +d -> d - i + 2d -> … -> d - i + kd
    • 第 n-1 行:
      • n-1 -> n-1+d -> n-1+2d -> …-> n-1+kd

解法一:创建二维数组,按照 N 形依次填入。时间复杂度和空间复杂度都是字符串长度 * numRow。

注意: n=1 直接返回原字符串,按照上面的规律会陷入死循环。

代码实现

public String convert(String s, int numRows) {
    if (numRows == 1) return s;
    StringBuilder ret = new StringBuilder();
    int n = s.length();
    int d = 2 * numRows - 2; // 公差
    int n1 = (n + d - 1) / d; // 周期个数,向上取整
    
    // 第 0 行
    for (int k = 0; k < n1; k++) ret.append(s.charAt(k * d));
    
    // 中间行
    for (int i = 1; i < numRows - 1; i++) {
        for (int k = 0; k < n1; k++) {
            if (i + k * d < n) ret.append(s.charAt(i + k * d));
            if (d - i + k * d < n) ret.append(s.charAt(d - i + k * d));
        }
    }
    
    // 最后一行
    for (int k = 0; k < n1; k++) {
        if (numRows - 1 + k * d < n) ret.append(s.charAt(numRows - 1 + k * d));
    }
    return ret.toString();
}

4. 外观数列(LC38)

题目描述

解题思路

利用双指针来模拟过程:left,right 初始为 0

  • right 向右移动,直到与 left 指向的字符不同,停止移动
  • right - left 就是中间的个数,接着 left 移动到 right 的位置,循环这个过程

代码实现

public String countAndSay(int n) {
    String s = "1";
    for (int i = 1; i < n; i++) {
        StringBuilder tmp = new StringBuilder();
        int len = s.length();
        int count = 0;
        for (int left = 0, right = 0; right < len;) {
            while (right < len && s.charAt(left) == s.charAt(right)) right++;
            tmp.append(String.valueOf(right - left));
            tmp.append(s.charAt(left));
            left = right;
        }
        s = tmp.toString();
    }
    return s;
}

5. 数青蛙(LC1419)

题目描述

解题思路

使用哈希表来存 c r o a k 每个字符:

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

代码实现

public int minNumberOfFrogs(String c) {
    char[] croakOfFrogs = c.toCharArray();
    int[] croak = new int[5];
    String s = "croak";
    Map<Character, Integer> index = new HashMap<>();
    for (int i = 0; i < 5; i++) index.put(s.charAt(i), i);
    
    for (char ch : croakOfFrogs) {
        if (ch == 'c') {
            if (croak[4] != 0) croak[4]--;
            croak[0]++;
        } else {
            int i = index.get(ch);
            if (croak[i - 1] != 0) {
                croak[i - 1]--;
                croak[i]++;
            } else {
                return -1;
            }
        }
    }
    
    for (int i = 0; i < 4; i++) {
        if (croak[i] != 0) return -1;
    }
    return croak[4];
}

目录

  1. 1. 替换所有的问号(LC1576)
  2. 题目描述
  3. 解题思路
  4. 代码实现
  5. 2. 提莫攻击(LC495)
  6. 题目描述
  7. 解题思路
  8. 代码实现
  9. 3. N 字形变换(LC6)
  10. 题目描述
  11. 解题思路
  12. 代码实现
  13. 4. 外观数列(LC38)
  14. 题目描述
  15. 解题思路
  16. 代码实现
  17. 5. 数青蛙(LC1419)
  18. 题目描述
  19. 解题思路
  20. 代码实现
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • GESP 2025 年 9 月 C++ 一级认证真题与解析(单选 1-15)
  • 利用 Higress 将 REST API 转换为 MCP Server 工具
  • 2026 年 3 月全球 AI 前沿动态与行业深度洞察
  • 我们的数据到底有多安全?网络安全经济学分析
  • 使用 Python 和 AI 构建智能害虫识别助手
  • Spring Boot 部署优化:打包体积缩小 80% 的实战方案
  • C++ 高阶数据结构:平衡二叉树(AVLTree)
  • PID 算法原理、实现与应用实战
  • Trae AI 编程提高工作效率技巧
  • Linux 常用命令汇总
  • C++与Linux基础:文件管理系统与缓冲区实现
  • 企业级新能源充电系统管理架构设计与实现
  • Python 列表 insert 方法:在指定位置插入元素
  • MySQL 分库分表实战:垂直分库与水平分表策略及分片键选择
  • Stable Diffusion XL 1.0 实战:灵感画廊的创意应用案例
  • 基于 Python-Django 的台球厅管理收费系统
  • 企业级大模型接入全流程:从需求分析到持续优化的八步指南
  • AI Agent 架构:基础组成模块深度解析
  • 【大模型微调】LLaMA Factory 微调 LLMs & VLMs
  • AI 提示词写作指南:精准表达与场景应用

相关免费在线工具

  • 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