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

【模拟算法】

目录

替换所有的问号

提莫攻击

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];
    }
}

相关文章:

  • requests库的request和response对象的属性和方法
  • 【PTA题目解答】7-4 数气球 (20分)
  • 清明祭祖(原创)
  • C++Primer学习(7.1 定义抽象数据类型)
  • 助力字体管理,规避设计卡顿的得力工具
  • 详解SQL数据定义功能
  • C++【类和对象】(结束篇)
  • 游戏引擎学习第160天
  • GHCTF web方向题解
  • Next.js项目MindAI教程 - 第七章:社区功能实现
  • 73.HarmonyOS NEXT PicturePreviewImage组件深度剖析:高级功能扩展与性能优化策略(三)
  • 多条件下的免杀webshell
  • 虚拟化数据恢复—重装系统服务器崩了的数据恢复过程
  • Spring Boot对接twilio发送邮件信息
  • 我的博客素材
  • 《灵珠觉醒:从零到算法金仙的C++修炼》卷三·天劫试炼(45)血海轮回阵 - Floyd-Warshall 多源最短路径
  • 02-Canvas-fabric.ActiveSelection
  • Rabit
  • Uniapp 开发 App 端上架用户隐私协议实现指南
  • Vuetify v-data-table footer文本适配中文
  • 中公教育薪酬透视:董监高合计涨薪122万,员工精简近三成
  • 张译、惠英红分获第二十届中国电影华表奖优秀男、女演员奖
  • 读科学发展的壮丽史诗,也读普通人的传奇
  • 中国人民对外友好协会代表团访问美国
  • 刘非履新浙江省委常委、杭州市委书记,曾在吉湘云多省任职
  • 青海西宁市公安局原党委委员、副局长王小华被“双开”