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

【模拟算法】

目录

替换所有的问号

提莫攻击

Z 字形变换

外观数列

数青蛙(较难)


模拟算法:比葫芦画瓢。思路较简单,考察代码能力。

1. 模拟算法流程,一定要在演草纸上过一遍流程

2. 把流程转化为代码

替换所有的问号

1576. 替换所有的问号 - 力扣(LeetCode)

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] == '?')// 替换
            {
                for (char ch = 'a'; ch <= 'z'; ch++) {
                    if ((i == 0 || ch != s[i - 1]) && (i == n - 1 || ch != s[i + 1])) {//
                        s[i] = ch;
                        break;
                    }
                }
            }
        }
        return String.valueOf(s);
    }
}
提莫攻击

495. 提莫攻击 - 力扣(LeetCode)

解题思路:看相邻两个元素的差值与中毒时间的大小比较

class Solution {
    public int findPoisonedDuration(int[] timeSeries, int duration) {
        int time = 0;
        if (duration == 0)
            return 0;
        for (int i = 0; i < timeSeries.length - 1; i++) {
            if (timeSeries[i] + duration < timeSeries[i + 1])
                time += duration;
            else {
                time += timeSeries[i + 1] - timeSeries[i];
            }
        }
        return time += duration;
    }
}
Z 字形变换

6. Z 字形变换 - 力扣(LeetCode)

①模拟(时间、空间复杂度高)

②找规律(较难)

根据下标进行填入:

class Solution {
    public String convert(String s, int numRows) {
        // 处理边界情况:
        if (numRows == 1)
            return s;
        int d = 2 * numRows - 2, n = s.length();// 公差
        StringBuilder ret = new StringBuilder();// 返回字符串
        // 先处理第一行
        for (int i = 0; i < n; i += d) {
            ret.append(s.charAt(i));
        }
        // 再处理中间行
        for (int k = 1; k < numRows - 1; k++) {// 依次枚举中间行
            for (int i = k, j = d - i; j < n || i < n; i += d, j += d) {
                if (i < n)
                    ret.append(s.charAt(i));
                if (j < n)
                    ret.append(s.charAt(j));
            }
        }
        // 最后处理最后一行
        for (int i = numRows - 1; i < n; i += d) {
            ret.append(s.charAt(i));
        }
        return ret.toString();
    }
}
外观数列

38. 外观数列 - 力扣(LeetCode)

解法:模拟+双指针

class Solution {
    public String countAndSay(int n) {
        String ret = "1";
        for (int i = 1; i < n; i++) {// 压缩n-1次
            StringBuilder tmp = new StringBuilder();
            int len = ret.length();
            for (int left = 0, right = 0; right < len;) {
                while (right < len && ret.charAt(left) == ret.charAt(right))
                    right++;
                tmp.append(Integer.toString(right - left));
                tmp.append(ret.charAt(left));
                left = right;
            }
            ret = tmp.toString();
        }
        return ret;
    }
}
数青蛙(较难)

1419. 数青蛙 - 力扣(LeetCode)

解法:模拟+哈希表

r,o,a,k->找前驱字符是否存在于哈希表 ①存在:前驱--,当前字符++②不存在:返回-1


c->找最后一个字符是否存在于哈希表 ①存在:最后字符--,当前字符++②不存在:当前字符++

class Solution {
    public int minNumberOfFrogs(String c) {
        char[] croakOfFrogs = c.toCharArray();// 将字符串转化为字符数组
        String t = "croak";
        int n = t.length();
        int[] hash = new int[n];// 数组模拟哈希表
        Map<Character, Integer> index = new HashMap<>();// [x,x字符对应下标]
        for (int i = 0; i < n; i++) {
            index.put(t.charAt(i), i);
        }
        for (char ch : croakOfFrogs) {
            if (ch == t.charAt(0)) {// ch=='c'
                if (hash[n - 1] != 0) {
                    hash[n - 1]--;
                }
                hash[0]++;// 当前字符('c')++
            } else {
                int i = index.get(ch);// 当前字符的下标
                if (hash[i - 1] != 0) {
                    hash[i - 1]--;
                    hash[i]++;
                } else
                    return -1;
            }
        }
        for (int i = 0; i < n - 1; i++) {
            if (hash[i] != 0)
                return -1;
        }
        return hash[n - 1];
    }
}
原文地址:https://blog.csdn.net/2301_80802299/article/details/146281046
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.kler.cn/a/586746.html

相关文章:

  • misc19~21
  • 如何在AVL树中高效插入并保持平衡:一步步掌握旋转与平衡因子 —— 旋转篇
  • ​​​​​​​大语言模型安全风险分析及相关解决方案
  • P3379 【模板】最近公共祖先(LCA)【题解】(倍增法)
  • 链表·简单归并
  • OpenBMC:BmcWeb添加路由3 设置权限
  • 机器学习 Day05 pandas库
  • Linux 系统蓝牙音频服务实现分析
  • 基于深度学习的蛀牙智能检测与语音提示系统【python源码+Pyqt5界面+数据集+训练代码】
  • C语言数据类型取值范围及格式化符号
  • CentOS 8 停止维护后通过 rpm 包手动安装 docker
  • 《P1540 [NOIP 2010 提高组] 机器翻译 题解》
  • Scala语言的数据库编程
  • 基于雪雁算法(Snow Geese Algorithm,SGA)的多个无人机协同路径规划(可以自定义无人机数量及起始点),MATLAB代码
  • MongoDB集合(表)自动创建机制
  • ffmpeg基础整理
  • 《AI浪潮中的璀璨新星:Meta Llama、Ollama与DeepSeek的深度剖析》:此文为AI自动生成
  • 利用matlab编制的转子动力学
  • springboot树形结构 支持模糊查询,返回匹配节点和父节点,其他节点不返回
  • Android开源库——RxJava和RxAndroid