专题六_模拟_算法详细总结

目录

模拟算法

1.模拟算法流程(一定要在草稿纸上演算一遍流程)

2.把流程转换成代码

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

解析:

1.暴力:

2.优化:(找规律)

总结:

2. 提莫攻击(easy)

解析:

1.暴力:

2.优化:

3. N 字形变换(medium)

解析:

1)暴力:

2)优化:

总结:

4. 外观数列 (medium)

解析:

1)暴力:

2)优化(小demo):

总结:

5. 数⻘蛙(medium)

解析:

1)暴力:

2)优化:

总结:


模拟算法

特点就是思路比较简单,特别考验的是如何把里路转换成代码的能力。

1.模拟算法流程(一定要在草稿纸上演算一遍流程)

2.把流程转换成代码

相对来说,模拟题读题就知道是跟着题目的意思一步一步走,但是但凡觉得只是暴力求解时间复杂度和空间复杂度太高了,那么就要转换思想去找规律。模拟题的优化,就是不断的找规律。

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

就是遍历整个字符串,然后替换里面的所有 '?' ,但是不能存在重复的字符。

解析:

1.暴力:

我开始第一次做的时候,就是创建了心得字符串str,然后每次再遇到不是'?' 的时候就加入,是就改变这个字符,但是在这之前为了保证字符不连续重复,我就用a和b来分别定义字符串中没有出现过的字符,然后用下标奇偶的关系就可以保证a,b交错不连续重复。

class Solution {
public:
    string modifyString(string _s) {
        string s;
        unordered_map<char,int> hash;
        for(auto e : _s) if(e!='?') hash[e]++;
        char a='a',b='a';
        while(hash[a]) a++; hash[a]++;
        while(hash[b]) b++;
        int i=1;
        for(auto e : _s)
        {
            if(e!='?') s+=e;
            else
            {
                if(i%2==0) s+=a;
                else s+=b;
            }
            i++;
        }
        return s;
    }
};

2.优化:(找规律)

线性时间复杂度,而且空间复杂度为O(1),只在原来的字符串s上进行修改,那么时间复杂度很低O(N),只需要早原串的基础上进行修改就行。

class Solution {
public:
    string modifyString(string s) {
        int n=s.size();
        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 s;
    }
};

总结:

像这种模拟题,就要尽可能的想到简便的办法来进行优化,其实很简单。

2. 提莫攻击(easy)

这题题意很简单,就是再中毒时间内,如果继续被攻击,那么就刷新中毒时间,从头开始,那么只需要计算数组每两个数之间的间隙大小是否大于中毒时间即可。

解析:

1.暴力:

想暴力,就是求出每个时间间隔然后再与中毒时间进行比较,小于中毒时间的就只加上这个间隙,否者就加上完整的中毒时间。

2.优化:

根据题目意思就是要看判断再你的下一次攻击时,对方是否再中毒期间,如果是,那么就要进行重置,就只要加上从上一次中毒到这次中毒的间隙,若这个间隙大于或等于中毒时间,那么就只能加上这个中毒时间即可,最后遍历完整个数组后就再加上最后一次的中毒时长就是最后的结果,其实跟暴力没啥区别。

class Solution {
public:
    int findPoisonedDuration(vector<int>& timeSeries, int duration) {
        int ret=0;
        int n=timeSeries.size();
        for(int i=0;i<n-1;i++)
        {
            int a=timeSeries[i+1]-timeSeries[i];
            if(a>=duration) ret+=duration;
            else ret+=a;
        }
        return ret+duration;
    }
};

3. N 字形变换(medium)

题意就是将字符串按照给出的行数,形成N行大小的Z字形,然后一行一行的读出字符,再进行输出。

解析:

1)暴力:

暴力肯定最开始想到就是按照字符串的下标顺序来进行存入二维数组里面,比如:这个字符串按照下标开始存入二维数组的第一列然后再开始斜边存入,再存入第二列,再次斜边存入等接下来存完整个二维数组,时间复杂度和空间复杂度都达到O(N^2),但是这题数据量小,可以试试,还是能过的,但是这种办法,我想这就头疼。必须要优化一下

2)优化:

那么说是优化,其实就是找规律,模拟,现根据题目意思进行模拟运算,比如创建一个二维数组来分别进行填入字符串的每一位,但是这一不管是时间复杂度还是空间复杂度都是O(N^2)都太过于复杂
那么就要对他进行优化,对于模拟题,优化都是采用找规律的形式,
1)首先看第一行,每两个数字之间都是由一个公差来决定的,那么就要想办法求出公差,公差就是两倍的行数减去2,或者,就是(二维矩阵行数-1)*2得到公差
2)那么最后一行同样是由一个公差来得到。
3)那么其间的k行[1,n-1]行就都是由两个数,来分别+公差d来组成的,第一个数就是k行的首元素,第二个数就是 d-k 为下标的元素

class Solution {
public:
    string convert(string s, int numRows) {
        int n=s.size();
        if(numRows==1) return s;
        string ret;
        //第一行
        //求公差
        int d=numRows*2-2;
        int prelude=0;
        while(prelude<n) ret+=s[prelude],prelude+=d;

        //中间行
        for(int k=1;k<=numRows-2;k++)
        {
            for(int i=k,j=d-k;i<n||j<n;i+=d,j+=d)
            {
                if(i<n) ret+=s[i];
                if(j<n) ret+=s[j];
            }
        }

        //最后一行
        int k=numRows-1;
        while(k<n) ret+=s[k],k+=d;

        return ret;
    }
};

总结:

对于这种题目有点复杂的模拟,就一定要耐心找到规律,就会变得很简单,重点就是如何把规律变成代码的形式。

4. 外观数列 (medium)

这题相对来说真的比较简单了,只要理解题目意思,真的模拟起来so easy~
题目就是说按照读法生成下一个字符串 "1" -> "1个1" -> "11"
那么"11" -> "2个1" -> "21"等

解析:

1)暴力:

暴力下就是不停的求出每一个次数条件下的字符串,其实优化也大差不差,都是再while里进行。

2)优化(小demo):

就是要再while外面记录s,每次循环一次们都要记录s,最后返回s。再就是在while里面,要记住每次循环完都要swap(ret,str) ,这样能保证ret每次都是要更新的新字符串,str每次都是上一次的字符串。

模拟这个字符串生成的规律,设置三个字符串,每次都更新str,用双指针left和right来记录重复的字符,并更新到ret里面,然后每次当right走到结尾时候,就把ret赋值给s,并且交换ret跟str,来达到再次更新的目的,最后返回s即可。

class Solution {
public:
    string countAndSay(int _n) {
        string ret;
        string str=to_string(1);
        if(_n==1) return str;
        string s;
        while(--_n)
        {
            int n=str.size();
            for(int left=0,right=0;right<n;right++)
            {
                if(str[left]!=str[right])
                {
                    ret+=to_string(right-left);
                    ret+=str[left];
                    left=right;
                }
                if(right==n-1)
                {
                    ret+=to_string(right-left+1);
                    ret+=str[left];
                }
            }
            s=ret;
            swap(str,ret);
            ret.clear();
        }
        return s;
    }
};

总结:

有些比较简单的模拟,真的一眼就能只知道怎么写,可能这就是提升吧。

5. 数⻘蛙(medium)

题目意思就是用最少的青蛙喊出最长的字符串,并且要满足"croak" 并且顺序要正确才行。

解析:

1)暴力:

这题如果想不上优化,那还真有点暴力,5个else if() 来判断条件,判断前面是否有字符存在满足条件是我当前字符的前一个,如果是就继续,不是就直接返回-1

2)优化:

首先就是解决5个else if()的问题,可以用一个unordered_map<char,int> index;来将字符串装起来,将字符串的字符与下标进行映射,然后创建一个hash表,这个hash表专门装入五个字符“蛙叫”

hash表,来记录最少青蛙的只数。

eg:

我现在读到的字符是ch=‘o’,那么我就要判断前面的字符‘r’是否存在过,如果现在存在,就证明这一只青蛙可以喊道我这个‘o’,否则就说明是错误的,返回-1

又比如:我已经有青蛙喊完了一遍,又碰到一个字符是ch,此时我的hash['k']==1,就说明有一次青蛙已经喊完了,但是,有碰到ch=='c' ,又要从头开始叫,那么就可以让这只已经叫过的青蛙重叫,就不会增加青蛙只数。

class Solution {
public:
    int minNumberOfFrogs(string croakOfFrogs) {
        string t="croak";
        int n=t.size();
        vector<int> hash(n);
        unordered_map<char,int> index;
        for(int i=0;i<n;i++) index[t[i]]=i;

        for(auto ch : croakOfFrogs)
        {
            if(ch=='c')
            {
                if(hash[n-1]!=0) hash[n-1]--;
                hash[0]++;
            }
            else
            {
                int i=index[ch];
                if(hash[i-1]==0) return -1;
                hash[i-1]--;hash[i]++;
            }
        }

        for(int i=0;i<n-1;i++) if(hash[i]!=0) return -1;
        return hash[n-1];
    }
};

总结:

主要优化就是要找到其中的规律,可以很暴力的求解,但是这样往往都十分消耗精力,可以多想一步,说不定就解决了多次else if()的问题。这个算法里面,用index将字符跟下标进行对应,很完美的解决了else if()来判断每次读到哪个字符,这个位置是否要加减的问题。

总结一下吧~模拟题相对来说确实比较轻松,只要读懂题意跟着题目一步步走一般问题不大,还是那句话,熟能生巧,本章节对我有很大促进作用,希望对你有用!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/879785.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue3+Element Plus:使用el-dialog,对话框可拖动,且对话框弹出时仍然能够在背景页(对话框外部的页面部分)上进行滚动以及输入框输入信息

【需求】 使用Element Plus中的el-dialog默认是模态的&#xff08;即它会阻止用户与对话框外部的元素进行交互&#xff09;&#xff0c;对话框弹出时仍然能够在背景页&#xff08;对话框外部的页面部分&#xff09;上进行滚动以及输入框输入信息&#xff0c;且对话框可拖动 【…

TCP/IP五层模型

OSI七层模型 OSI(Open Systems Interconnection)七层模型是一种概念框架&#xff0c;用于标准化不同计算机系统之间的通信过程 它由国际标准化组织(ISO)在1984年提出&#xff0c;主要用于网络通信 这七层模型从上到下分别是: 应用层(Application Layer):为应用软件提供网络服…

tomcat服务器

tomcat简介 Tomcat 服务器是一个免费的开放源代码的Web 应用服务器&#xff0c;属于轻量级应用服务器。Tomcat 虽然和 Apache 或者 Nginx 这些 Web 服务器一样&#xff0c;具有处理 HTML 页面的功能&#xff0c;然而由于其处理静态 HTML 的能力远不及 Apache 或者 Nginx&#x…

Leetcode 93-复原 IP 地址

有效 IP 地址 正好由四个整数&#xff08;每个整数位于 0 到 255 之间组成&#xff0c;且不能含有前导 0&#xff09;&#xff0c;整数之间用 ‘.’ 分隔。 例如&#xff1a;“0.1.2.201” 和 “192.168.1.1” 是 有效 IP 地址&#xff0c;但是 “0.011.255.245”、“192.168.…

计算机毕业设计 服装生产管理系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

MySQL之表内容的增删改查(含oracel 9i经典测试雇佣表下载)

目录 一:Create 二:Retrieve 1.select列 2.where条件 3.结果排序 4. 筛选分页结果 三:Update 四:Delete 1.删除数据 2. 截断表 五&#xff1a;插入查询结果 六&#xff1a;聚合函数 七:group by子句的使用 表内容的CRUD操作 : Create(创建), Retrieve(读取)…

Win10 录屏秘籍大公开:从新手到高手的进阶之路

之前因为某些原因不方便到客户那里进行软件培训&#xff0c;我们就发现录屏讲解供客户随时查看的方式好像更有效果。这次我就介绍一些能够实现win10怎么录屏操作的工具讲解。 1.福昕录屏大师 链接&#xff1a;www.foxitsoftware.cn/REC/ 这个工具是一款专业的电脑录屏软件&a…

【三大运营商】大数据平台体系架构【顶层规划设计】

在国内运营商&#xff08;如中国移动、中国联通、中国电信&#xff09;的大数据平台建设中&#xff0c;顶层规划设计至关重要。以下是针对三大运营商为例【如电信】的大数据平台体系架构的顶层规划设计方案&#xff0c;涵盖整体架构、关键组件、数据管理、应用场景等方面。 1. …

2023年全国研究生数学建模竞赛华为杯B题DFT类矩阵的整数分解逼近求解全过程文档及程序

2023年全国研究生数学建模竞赛华为杯 B题 DFT类矩阵的整数分解逼近 原题再现&#xff1a; 一、问题背景   离散傅里叶变换&#xff08;Discrete Fourier Transform&#xff0c;DFT&#xff09;作为一种基本工具广泛应用于工程、科学以及数学领域。例如&#xff0c;通信信号…

react 基础语法

前置知识 类的回顾 通过class关键字定义一个类 类名首字母大写 class类有constructor构造器 new 一个类得到一个实例 类还有方法&#xff0c;该方法也会在其原型上 static静态数据&#xff0c;访问静态属性通过 类名.id getter和setter getter&#xff1a;定义一个属性&…

kubernetes存储之GlusterFS(GlusterFS for Kubernetes Storage)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

Agent Zero

文章目录 一、关于 Agent Zero现在有了UI&#xff1a;关键概念1、General-purpose 助理2、计算机作为工具3、多智能体合作4、完全可定制和可扩展5、沟通是关键 不错的功能记住已知问题理想的环境 二、Setup - 如何在Windows和MacOS上安装Agent Zero提醒&#xff1a;1、安装Cond…

Tiny-universe学习笔记1:Qwen-blog

本文是参与Datawhale Tiny-universe组队学习的第一篇学习笔记&#xff0c;参考链接&#xff1a;https://github.com/datawhalechina/tiny-universe Tiny-universe学习笔记1&#xff1a;Qwen-blog Qwen整体架构与Llama2类似&#xff0c;具体如下图所示&#xff1a; 其中&#…

深度学习笔记(8)预训练模型

深度学习笔记&#xff08;8&#xff09;预训练模型 文章目录 深度学习笔记&#xff08;8&#xff09;预训练模型一、预训练模型构建一、微调模型&#xff0c;训练自己的数据1.导入数据集2.数据集处理方法3.完形填空训练 使用分词器将文本转换为模型的输入格式参数 return_tenso…

Java | Leetcode Java题解之第417题太平洋大西洋水流问题

题目&#xff1a; 题解&#xff1a; class Solution {static int[][] dirs {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};int[][] heights;int m, n;public List<List<Integer>> pacificAtlantic(int[][] heights) {this.heights heights;this.m heights.length;this.n…

【JSrpc破解前端加密问题】

目录 一、背景 二、项目介绍 三、JSrpc 处理前端加密步骤 一、背景 解决日常渗透测试、红蓝对抗中的前端密码加密问题&#xff0c;让你的爆破更加丝滑&#xff1b;降低js逆向加密的难度&#xff0c;降低前端加密逻辑分析工作量和难度。 二、项目介绍 运行服务器程序和js脚本…

springCloud(一)注册中心

1.Eureka 要是user-service服务有多个&#xff0c;order-service该怎么调用&#xff1f; 这就需要用到 注册中心 了 。 1.1 搭建Eureka服务 1. pom引入依赖 <dependencies><!--eureka服务端--><dependency><groupId>org.springframework.cloud</gr…

线程局部变量

开发线程的步骤 为什么要学 ThreadLocal 就是为了防止开发随意选库&#xff0c;设置线程局部变量 因为初始化随着项目启动-创建了连接池&#xff0c;但目前getinfo和login都是走从库&#xff0c;没有分开 所以在service层方法运行时&#xff0c;用ReqAop代码提前算出此方法走…

将有序数组——>二叉搜索树

给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵平衡二叉搜索树。 示例 1&#xff1a; 输入&#xff1a;nums [-10,-3,0,5,9] 输出&#xff1a;[0,-3,9,-10,null,5] 解释&#xff1a;[0,-10,5,null,-3,null,9] 也将被视为正确答案…

Modbus_RTU和Modbus库

目录 一.Modbus_RTU 1. 与Modbus TCP的区别 2. Modbus RTU特点 3. Modbus RTU协议格式 4. 报文详解 5. 代码实现RTU通信 1. 打开模拟的RTU从机 2. linux端使用代码实现和串口连接 2.1. 框架搭建 2.2 代码 二.Modbus库 1.库函数 一.Modbus_RTU 1. 与Modbus T…