【优选算法】模拟算法:替换所有的问号,提莫攻击,N字形变换,外观数列,数青蛙

文章目录

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

替换所有的问号

题目描述

解题思路

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

代码实现

java 复制代码
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,表示最后一次"攻击"的时间

代码实现

java 复制代码
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)

N字形变换

题目描述

解题思路

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

  • 解法二:依据模拟过程找规律,把字符的下标模拟到矩阵中:

    • 第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=1直接返回原字符串,按照上面的规律会陷入死循环。

代码实现

java 复制代码
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的位置,循环这个过程

代码实现

java 复制代码
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 这个字符;如果没有,就重新搞⼀个青蛙。

代码实现

java 复制代码
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];
    }
相关推荐
仟濹2 小时前
算法打卡 day1 (2026-02-06 周四) | 算法: DFS | 1_卡码网98 可达路径 | 2_力扣797_所有可能的路径
算法·leetcode·深度优先
yang)2 小时前
欠采样时的相位倒置问题
算法
历程里程碑2 小时前
Linux20 : IO
linux·c语言·开发语言·数据结构·c++·算法
A尘埃2 小时前
物流公司配送路径动态优化(Q-Learning算法)
算法
天若有情6732 小时前
【自研实战】轻量级ASCII字符串加密算法:从设计到落地(防查岗神器版)
网络·c++·算法·安全·数据安全·加密
啊森要自信2 小时前
CANN ops-cv:AI 硬件端视觉算法推理训练的算子性能调优与实战应用详解
人工智能·算法·cann
仟濹3 小时前
算法打卡day2 (2026-02-07 周五) | 算法: DFS | 3_卡码网99_计数孤岛_DFS
算法·深度优先
驭渊的小故事3 小时前
简单模板笔记
数据结构·笔记·算法
YuTaoShao3 小时前
【LeetCode 每日一题】1653. 使字符串平衡的最少删除次数——(解法一)前后缀分解
算法·leetcode·职场和发展