leetcode中的状态机类型的题目

1 总结

一般是涉及到多个状态之间的转换,需要定义一个具有多个枚举值的变量,各个状态之间通过各种条件互相变化

2 LC57. 插入区间

leetcode中的状态机类型的题目_第1张图片

2.1 解析

先是要确定新区间插入到哪一个位置(也有可能),插入后需要确定这个区间是否涉及到合并问题。
所以我们可以设计一个flag变量,确定区间是否插入,插入完成则进行到区间合并阶段。

2.2 代码:beat 95% commits in time complexity

class Solution {
    public int[][] insert(int[][] intervals, int[] newInterval) {
        int n=intervals.length;

        List<int[]>ans=new ArrayList<>();
        boolean f=false;//表示现待处理新区间的插入状态,f=true则表示处理完成,开启合并区间的状态
        for(int i=0;i<n;){
            int[] interval=intervals[i];
            if(!f){
                if(interval[1]<newInterval[0]){
                    ans.add(interval);
                    i++;
                }else if(interval[1]>=newInterval[0]&&interval[1]<=newInterval[1]){
                    int[]ni=new int[]{Math.min(interval[0],newInterval[0]),Math.max(interval[1], newInterval[1])};
                    ans.add(ni);
                    f=true;
                    i++;
                }else if(interval[0]>newInterval[1]){
                    ans.add(newInterval);
                    f=true;
                }else if(interval[0]<=newInterval[0]&&interval[1]>=newInterval[1]){
                    ans.add(interval);
                    f=true;
                    i++;
                }else if(interval[0]>=newInterval[0]&&interval[0]<=newInterval[1]){
                    ans.add(new int[]{newInterval[0],interval[1]});
                    f=true;
                    i++;
                }
            }else {
                // 转换为合并区间问题
                int[]li=ans.get(ans.size()-1);
                if(li[1]<interval[0]){
                    ans.add(interval);
                }else if(li[1]>=interval[0]){
                    int[]newi=new int[]{Math.min(li[0],interval[0]),Math.max(li[1],interval[1])};
                    ans.remove(ans.size()-1);
                    ans.add(newi);
                }
                i++;
                
            }
        }
        // 如果f一直是false,则说明新区间加在末尾
        if(!f){
            ans.add(newInterval);
        }
        int[][]res=new int[ans.size()][2];
        for(int i=0;i<ans.size();i++){
            res[i]=ans.get(i);
        }
        return res;
    }
}

3 LC722. 删除注释【2024秋招后端面试题】

3.1 分析

这道题的状态机的状态稍多,题目稍复杂

3.2 代码:beat 100% commits in time complexity

    // 假设注释内有了
    public List<String> removeComments(String[] source) {

        List<String>res=new ArrayList<>();
        StringBuilder sb=new StringBuilder();
        // 0:初始状态,1:行注释,2:块注释,3:引号
        // 1->0, 2->0, 

        int flag=0;
        int n=source.length;
        for(int i=0;i<n;i++){
            String str=source[i];
            char cs[]=str.toCharArray();
            int m=cs.length;

            for(int j=0;j<m;){
                // 只能在初始状态转为行注释状态
                if(j<m-1&&flag==0&&cs[j]=='/'&&cs[j+1]=='/'){
                    String addStr=sb.toString();
                    if(!"".equals(addStr)&&addStr!=null){
                        res.add(addStr);
                    }
                    sb=new StringBuilder();
                    flag=1;
                    j+=2;
                    break;
                }
                // 只能在初始状态转为多行注释状态
                if(j<m-1&&flag==0&&cs[j]=='/'&&cs[j+1]=='*'){

                    flag=2;
                    j+=2;
                    continue;
                }
                // 在多行注释的状态下转换为初始状态
                if(j<m-1&&flag==2&&cs[j]=='*'&&cs[j+1]=='/'){

                    flag=0;
                    j+=2;
                    continue;
                }
                // 开启引号状态
                if(j<m-1&&flag==0&&cs[j]=='"'){
                    flag=3;
                }
                // 关闭引号状态
                if(j<m-1&&flag==3&&cs[j]=='"'){
                    flag=0;
                }

                //处于引号或者初始状态的字符都可以被加入
                if(flag==0||flag==3){
                    sb.append(cs[j]);
                    j++;
                    continue;
                }
                j++;
            }
            // 当正常状态时,每一次换行都需要添加到res结果集中
            if(flag==0){
                String addStr=sb.toString();
                if(!"".equals(addStr)&&addStr!=null){
                    res.add(addStr);
                }
                sb=new StringBuilder();
            }
            // 当换行时,行注释状态自动回到初始状态
            if(flag==1){
                sb=new StringBuilder();
                flag=0;
            }
        }
        return res;
    }

你可能感兴趣的:(数据结构,leetcode,java,状态机)