模拟算法leetcode刷题

news2025/1/4 16:00:14

1)替换所有的问号:

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

2)将流程转化成代码

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

class Solution {
    public String modifyString(String s) {
        char[] array=s.toCharArray();
        for(int i=0;i<array.length;i++){
            if(array[i]=='?'){
                for(char ch='a';ch<='z';ch++){
//1.当i==0的时候其实是处于最前面的位置,前面这个字符不存在直接就判断后面这个字符即可
//或者是前面这个字符是存在的,和前面的字符不相等即可
//2.就是当i==0或者是i==array.length-1的情况是不需要进行判断
if((i==0||ch!=array[i-1])&&(i==array.length-1||ch!=array[i+1])){
                          array[i]=ch;
                          break;
                    }else{
                        continue;
                    }
                }
            }
        }
//将字符数组转化成字符串
    return String.valueOf(array);
    }
}

2)提莫攻击:

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

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

算法原理:

1)先进行计算两次受到攻击的时候,所受到攻击时间的差值,如果差值是大于等于duaration的话,大于中毒时间,说明在前面所收到的攻击总的中毒时间是需要进行全部累加上的,为两次受到的攻击时间是有差值的,当这段差值是大于等于中毒时间的,说明你在a点受到攻击之后,在受到下一次攻击之前,这个中毒时间已经全部承受了,所以中毒时间需要全部进行累加

2)再进行计算两次攻击的时候,所受到的攻击时间的差值是小于duartion,相当于是你在受到第一次攻击之后,这一次的中毒时间还没有完全过去,就又来了一次攻击,中毒时间又被重置,那么两次受到攻击的这段时间的差值就是a-b此时所进行计算的中毒时间是不包含第二次攻击所包含的那一秒的

3)当受到最后一次攻击的时候,那么最后这一次中毒时间是一定可以持续完的

3)N字形变换:

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

解法1:暴力破解

将所有字符存放到一个二维数组

class Solution {
    public String convert(String s, int numRows) {
       if(numRows==1) return s;
        char[][] dp=new char[numRows][s.length()];
        char[] array=s.toCharArray();
        int col=0;
        int row=0;
        int index=0;
        StringBuilder result=new StringBuilder();
        while(index<array.length){
            while(index<array.length&&row<numRows){
                dp[row][col]=array[index];
                row++;
                index++;
            }
            col++;
            row=row-2;
            while(index<array.length&&row>=0&&col<array.length){
                 dp[row][col]=array[index];
                 col++;
                 row--;
                 index++;
            }
            row+=2;
            col--;
        }
      for(int i=0;i<numRows;i++){
        for(int j=0;j<s.length();j++){
            if(dp[i][j]!='\u0000')
             result.append(dp[i][j]);
           }
         }
        return result.toString();
    }
}

解法2:根据分组周期性拼接:

class Solution {
    public String convert(String s, int numRows) {
    if(numRows==1) return s;
    char[] array=s.toCharArray();
    int period=2*numRows-2;
//1.创建一个字符串数组用来存放每一行字符拼接的结果
    String[] strings=new String[numRows];//默认的初始化结果都是null,必须给字符串数组全部初始化成""
    for(int i=0;i<strings.length;i++){
        strings[i]="";
    }
//2.进行计算每一个字符应该存放在字符串数组中的每一行
    for(int i=0;i<array.length;i++){
        int mod=i%period;
        if(mod<numRows){
           strings[mod]+=array[i];
        }else{
           strings[period-mod]+=array[i];
         }
       } 
//3.遍历字符数组返回结果
   StringBuilder sb=new StringBuilder();
   for(String str:strings){
         System.out.println(str);
         sb.append(str);
      }
    return sb.toString();
    }
}

解法三:找规律

把原始的模拟结果给画出来,再找规律,推导出规律之后说明这个规律是正确的

String str="abcdefghijk" 

我们将字符串转化成数组,将下标填写到N自行变换的对应位置

1)首先我们先找第一行和最后一行的元素下标的对应关系

首先进行观察,第一行第一个元素和第二个元素之间以及第二个元素到第一行第三个元素之间都相差了2N-2个元素(N是行数)

所以第一行的字符就是:0 0+2N-2 0+1*(2N-2) 0+K(2N-2)

所以说最后一行的元素的组合就是:N-1,N-1+(2N-2),N-1+2*(2N-2),N-1+K(2N-2)

2)现在来寻找一下除了第一行和最后一行的元素的规律:已知公差是D=2N-2

别的行前两个元素是K和D-K

后面的元素依次是K+D,D-K+D,两个偶数对依次向后+D

这个规律针对于所有的K都适用

class Solution {
    public String convert(String s, int numRows) {
        if(numRows==1) return s;
        char[] array=s.toCharArray();
        StringBuilder sb=new StringBuilder();
        String[] strings=new String[numRows];
        int index=0;
        for(int i=0;i<numRows;i++){
            strings[i]="";
        }
    int period=2*numRows-2; 
//1.先进行处理第一行
        while(index<array.length){
          strings[0]+=array[index];
          index=index+period;
        }
//2.在来进行处理最后一行
     index=numRows-1;
     while(index<array.length){
         strings[numRows-1]+=array[index];
         index=index+period;
     }
//3.处理中间两行
    for(int i=1;i<=numRows-2;i++){
        int start=i;
        int end=period-i;
        while(start<array.length||end<array.length){
//注意这里面不可以写成&&因为end越界了但是start可能没有越界
           if(start<array.length)strings[i]+=array[start];
           if(end<array.length)strings[i]+=array[end];
           start=start+period;
           end=end+period;
        }
      }
//4.返回结果
    for(int i=0;i<strings.length;i++){
         sb.append(strings[i]);
       }
       return sb.toString();
    }
}

4)外观数列:

算法原理:如何找到对上一个数的解释+双指针

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

class Solution {
    public String countAndSay(int n) {
        if(n==1) return "1";
        String s="1";
        StringBuilder sb=null;
        for(int i=1;i<n;i++){
            int left=0;
            int right=0;
            sb=new StringBuilder();
            char[] array=s.toCharArray();
            while(right<s.length()){
               while(right<array.length&&array[right]==array[left]){
                   right++;
               }
               sb.append(right-left);
               sb.append(array[left]);
               left=right;
            }
            s=sb.toString();
            System.out.println(s);
        }
      return sb.toString();
    }
}

4)数青蛙

模拟+哈希表

1419. 数青蛙 - 力扣(LeetCode)

算法原理:

1)完美模拟的情况:正好能够叫出一个青蛙该叫出来的所有字符的情况

1)当字符串从前向后进行遍历的时候,当遍历到r字符的时候,只需要看看前面有没有c字符即可,有没有青蛙叫出c字符即可,所以我们每当遍历到一个字符的时候,还需要进行统计前一个字符出现的情况

2)就拿这个字符串举例来说,当进行遍历到c字符的时候,有一个青蛙开始叫了,字符c对应的value就置为1,当遍历到r的时候,看看前面有没有c字符出现过,发现有c字符出现过,那么于是就让c字符出现的次数--,r出现的次数++

3)当进行遍历到o的时候,于是去前面找找有没有一个青蛙叫出r这个字符,发现有,那么就让r--,o++

4)以此类推,直到遍历整个字符串,当我们发现K的值等于2的时候,此时发现遍历字符串的位置又从c开始了,因为我们求的是最少的青蛙的个数,于是我们可以让k--,c=1,剥离出一个青蛙从头开始叫

最终K存放的值就是最终结果,况且CROA的哈希表中存放的个数都是0,想象一下,如果CROK中的字符有一个不等于0,那么说明这个青蛙还没有叫完字符串的遍历就终止了

2)模拟失败的情况:

假设现在字符是crroak

也就是是说每当我们进行遍历到一个字符的时候,都是需要进行检查前面的字符有没有出现过,没有出现过就直接返回-1,如果出现过就让前面的字符--,当前字符++

3)总结:

 

1)当进行遍历到r o a k的时候,找一下前驱字符,看看是否在哈希表中出现过,如果存在,那么前驱字符减减,当前字符++,如果这个字符的前驱字符不存在,那么直接返回-1,说明前面的字符没有青蛙叫过,此时说明这个字符非法,这个字符串也是非法的;

2)当遍历到c字符的时候,看看这个最后一个字符是否在哈希表中存在过,如果最后一个字符存在的话,说明已经有青蛙叫完了,那就尝试从头开始叫,那就让最后一个字符--,当前c字符++,如果最后一个字符没有出现过,那么说明没有一个青蛙叫到最后一个字符,此时说明是第一个青蛙叫到c字符,此时c++即可

3)当遍历完所有字符的时候,看看k前面的字符出现次数是否是0,如果不是0,说明有青蛙没叫完,就直接返回-1,字符串非法

class Solution {
    public int minNumberOfFrogs(String str) {
        char[] array=str.toCharArray();
        int[] CountArray=new int[200];
        String s="croak";
    for(int i=0;i<str.length();i++){
        if(array[i]=='r'||array[i]=='o'||array[i]=='a'||array[i]=='k'){
            int index=s.indexOf(array[i]);
            System.out.println(index);
                if(CountArray[s.charAt(index-1)]==0){
//这里面不是CountArray[i-1]
                    return -1;
                }else{
                   CountArray[array[i]]++;
                   CountArray[s.charAt(index-1)]--;
                }
            }else{
                if(CountArray['k']>0){
                    CountArray['c']++;
                    CountArray['k']--;
                }else{
                    CountArray['c']++;
                }
            }
        }
      for(int i=0;i<array.length;i++){
     if(array[i]=='r'||array[i]=='o'||array[i]=='a'||array[i]=='c'){
           if(CountArray[array[i]]>0){
               return -1;
           }
        }
      }
    return CountArray['k'];
    }
}
 class Solution {
    public int minNumberOfFrogs(String str) {
        char[] array=str.toCharArray();
        int[] CountArray=new int[200];
        String s="croak";
    for(int i=0;i<str.length();i++){
        if(array[i]!=s.charAt(0)){
            int index=s.indexOf(array[i]);
            System.out.println(index);
                if(CountArray[s.charAt(index-1)]==0){
                    return -1;
                }else{
                   CountArray[array[i]]++;
                   CountArray[s.charAt(index-1)]--;
                }
            }else{
                if(CountArray[s.charAt(s.length()-1)]>0){
                    CountArray[array[i]]++;
                    CountArray[s.charAt(s.length()-1)]--;
                }else{
                    CountArray[array[i]]++;
                }
            }
        }
      for(int i=0;i<array.length;i++){
     if(array[i]!=s.charAt(s.length()-1)){
           if(CountArray[array[i]]>0){
               return -1;
           }
        }
      }
    return CountArray[s.charAt(s.length()-1)];
    }
}     

写法三:

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

去掉回车和换行符

1.工具用notePad 把Linux 等环境下的日志打印出来的sql 复制出来时包含换行符和回车符&#xff0c;无法直接在数据库客户端工具直接执行&#xff0c;需要去掉换行符和回车符。使用notepad 中的替换功能批量替换回车符和换行符。

6. 测试的分类以及黑盒测试、白盒测试和黑盒测试的区别

目录 1. 按照测试对象划分 1.1 界面测试 1.2 可靠性测试 1.3 容错性测试 1.5 兼容性测试 1.6 易用性测试 1.7 安装卸载测试 1.8 安全性测试 1.9 性能测试 1.10 内存泄漏测试 2. 按是否查看代码划分 2.1 黑盒测试&#xff08;Black-box Testing&#xff09; 优点 …

在 IDEA 中使用 Git 图文教程

Git 专栏索引&#xff1a; Git 分布式版本控制系统使用教程 在 IDEA 中使用 Git 图文教程 在 IDEA 中使用 Git 图文教程 &#x1f680;1. 配置 Git&#x1f680;2. 创建项目远程仓库&#x1f680;3. 初始化本地仓库&#x1f680;4. 连接远程仓库&#x1f680;5. 提交到本地仓库…

Python(二十三)运算符——赋值运算符

❤️ 专栏简介&#xff1a;本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中&#xff0c;我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 &#xff1a;本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

CityGML三维场景查看

今天我将展示如何读取 CityGML 文件并以 3D 方式查看其信息&#xff0c;以及如何通过挤出将shapefile转化为3D模型。 我还没有找到 3D 渲染器中可用设置的非常详细的描述&#xff0c;因此我花了一些时间测试它们。 我试图弄清楚它们的作用以及何时使用它们。 我将在本文末尾解…

英码积极参与行业交流活动,“快、易、省”赋能更多企业具备AI能力

2023年&#xff0c;ChatGPT的火爆引发了算力需求的大爆发&#xff0c;有人说&#xff0c;边缘计算因兼具时延低与安全等优势&#xff0c;或将成为解决AI算力紧张的良方&#xff1b;在人工智能产业发展的推动下&#xff0c;边缘计算成为了众人瞩目的焦点。随着应用场景的多元化和…

关于 华为云:服务器上传文件夹后显示403

问题原因&#xff1a; 华为云&#xff1a;当前使用的操作系统默认的umask 值是0027 上传文件后出现权限403 的问题&#xff1a; 解决1&#xff1a;修改 /etc/profile 文件 027 022 查看是否修改&#xff1a; 指令&#xff1a;umask 0022 需要删除之前的 文件重新上传&am…

【C语言】指针还不会?这一篇就够了

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前正在回炉重造C语言&#xff08;2023暑假&#xff09; ✈️专栏&#xff1a;【C语言航路】 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你…

HNU-计算机系统CS-学习感悟

本学期学的两门核心课&#xff0c;一个CS&#xff0c;一个OS。对我来说都有一定难度。 CS总评91/100。主要是期末考试没太发挥好&#xff0c; 主要原因是存储部分有个没有考虑写的情况&#xff0c;送了8分。 总领 CS的学习采用最经典的书——CSAPP&#xff0c;也被称为计算机…

vue3 ts vite electron开发桌面程序

1、搭建vuetsvite项目 # 创建Vue项目 npm init vue # 安装依赖 npm install # 一定要安装成开发依赖 npm install electron electron-builder -D 根目录创建plugins文件夹&#xff0c;文件夹中创建ts文件&#xff0c;vite.electron.build.ts是打包文件代码&#xff0c;v…

LeetCode面试题02.07.链表相交

面试题02.07.链表相交 两种解题思路 面试题02.07.链表相交一、双指针二、哈希集合 一、双指针 这道题简单来说&#xff0c;就是求两个链表交点节点的指针 这里注意&#xff1a;交点不是数值相等&#xff0c;而是指针相等 为了方便举例&#xff0c;假设节点元素数值相等&…

MySQL 坐标批量计算及优化

文章目录 1、坐标计算2、优化 现在有一个需求&#xff0c;就是找出距离某用户最近的一些点&#xff0c;一种实现方法就是调用地图的api来计算筛选&#xff0c;另外一种就是在数据库中计算&#xff0c;考虑到地图api有并发量限制&#xff0c;所以选用数据库计算的方式。 1、坐标…

Python实现HBA混合蝙蝠智能算法优化BP神经网络分类模型(BP神经网络分类算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 蝙蝠算法是2010年杨教授基于群体智能提出的启发式搜索算法&#xff0c;是一种搜索全局最优解的有效方法…

成功升级scikit-image的版本,从老版本0.13.0到0.17.2

成功升级scikit-image的版本&#xff0c;从老版本0.13.0到0.17.2 之前参考其他博客升级scikit-image的版本没有成功&#xff0c;这次参考scikit-image的github官网&#xff0c;顺利实现了升级。 scikit-image的github官网中关于安装的介绍页 https://github.com/scikit-imag…

Dubbo入门实战最全攻略(基于 Spring Boot 实现)

Dubbo应用 RPC通信 Apache Dubbo 3构建在 HTTP/2 协议之上&#xff0c;具有更好的穿透性与通用性 &#xff0c; 支持基于 IDL 的服务定义 集成了业界主流的大部分协议&#xff0c;使得用户可以在 Dubbo 框架范围内使用这些通信协议 &#xff0c; 这些协议包括 rest、hessian…

【动态规划】三步问题

&#x1f9c1;题目描述&#xff1a; 示例&#xff1a; &#x1f9c0;(1)题目解析&#xff1a; 小孩每一次可以走1,2,3步&#xff0c;那么形成不同的排列组合&#xff0c;会有很多种上楼梯方式。 &#x1f9c0;(2)算法原理&#xff1a; &#x1f951;[1]状态表示 根据题目要…

【C++杂货铺】构造函数和析构函数

文章目录 一、类的六个默认成员函数二、构造函数三、析构函数 一、类的六个默认成员函数 &#x1f4d6;默认成员函数 用户没有显式实现&#xff0c;编译器会自动生成的成员函数&#xff0c;称为默认成员函数。 构造函数&#xff1a;完成对象的初始化工作。析构函数&#xff…

容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档

一、Docker docker是一种开源的应用容器引擎&#xff0c;可以将应用程序和依赖打包成一个可移植的镜像&#xff0c;然后发布到任何支持docker的平台上&#xff0c;也可以实现虚拟化。docker的核心概念有三个&#xff1a;镜像&#xff08;image&#xff09;、容器&#xff08;co…

QT中QTimer的循环时间与槽函数执行时间以及在事件循环中触发,不同时间的结果分析

目录 当循环时间小于槽函数时间时&#xff1a; 当循环间隔时间大于槽函数时间时&#xff1a; 当存在两个定时器器&#xff0c;其中一个还是间隔100ms&#xff0c;另一个间隔1000ms&#xff1a; 当两个定时器的循环周期大于槽函数执行时间时 当在主程序中添加一个for循环…

怎么把视频转为gif动态图,3个方法轻松转换!

如何将视频转换为GIF动态图呢&#xff1f;相信许多人在日常聊天中喜欢使用各种有趣的表情包。每当互联网上出现一些有趣的热门视频时&#xff0c;我们也往往会看到许多相关的GIF表情包。那么我们应该如何将自己的视频或者一些有趣的视频制作成GIF动态图呢&#xff1f;下面我就为…