模拟算法专题——算法介绍算法讲解力扣实战应用

news2024/9/22 4:19:08

目录

1、模拟算法介绍

2、算法应用【leetcode】

2.1 替换所有的问号

2.1.1 算法思想

 2.1.2 算法代码

 2.2 提莫攻击

2.2.1 算法思想

2.2.2 算法代码

2.3 Z字形变换

2.3.1 算法思想

2.3.2 算法代码

2.4 外观数列

2.4.1 算法思想

2.4.2 算法代码

2.5 数青蛙

2.5.1 算法思想

2.5.2 算法代码


1、模拟算法介绍

模拟算法其实就是——比葫芦画瓢。

模拟算法的思想很简单,解题思路一般在题目上就给了,我们只需用代码将题目的要求模拟出来就可以了,所以模拟算法对代码能力要求较强,模拟算法并没有固定的模版,我们只需将题目要求用代码模拟出来即可。

 模拟算法是一种计算机算法,用于模拟或仿真现实世界中的某个过程、系统或现象。它通过运行一系列的步骤或规则来模拟目标对象的行为,并生成与真实情况相似的结果。


2、算法应用【leetcode】

2.1 替换所有的问号

. - 力扣(LeetCode)

2.1.1 算法思想

本题为简单模拟题,只需将字符'?'替换为前后不连续的字符即可。

  1. 从'a'~'z'中寻找字符,与i-1位置和i+1位置比较,判断是否出现连续的字符(字符重复)
  2. 注意:0下标处和n-1下标处要额外处理,避免越界访问

 2.1.2 算法代码

class Solution {
    public String modifyString(String s) {
        char[] ss = s.toCharArray();
        int len = ss.length;
        for (int i = 0; i < len; i++) {
            //替换字符
            if (ss[i] == '?') {
                for (char j = 'a'; j < 'z'; j++) {
                    if ((i == 0 || ss[i - 1] != j) && (i == len - 1 || ss[i + 1] != j) ) {
                        ss[i] = j;
                        break;
                    }
                }
            }
        }
        return String.valueOf(ss);
    }
}

 2.2 提莫攻击

. - 力扣(LeetCode)

2.2.1 算法思想

计算出每两次发动攻击之间的时间差x,判断是否 >= 持续时间d秒:

  1. 若x >= d,则说明时间充裕,d秒时间内会一直中毒,中毒时间ret += d
  2. 若x < d,则说明时间不够,中毒时间会重复,中毒时间ret += 时间差x
  3. 最后一次攻击,时间必然充裕,必然中毒d秒,中毒时间ret += d

2.2.2 算法代码

class Solution {
    public int findPoisonedDuration(int[] timeSeries, int duration) {
        int ret = 0;
        for(int i = 0; i < timeSeries.length - 1; i++) {
            int x = timeSeries[i + 1] - timeSeries[i];
            if(x < duration) ret += x;
            else ret += duration;
        }
        //最后一次攻击,必然中毒d秒
        ret += duration;
        return ret;
    }
}

2.3 Z字形变换

. - 力扣(LeetCode)

2.3.1 算法思想

在模拟算法中,若想要寻得时空效率高的算法,只能通过找规律来做优化。

我们将字符的下标放在矩阵中,求得公差d = 2*n - 2,且发现字符在矩阵中和下标有以下规律:

  • ①:当k==0时(第一行),k += d,拿到下一个要打印的字符的下标,直到k >= 字符串.len
  • ②:当k == n-1时(最后一行),k += d,拿到下一个要打印的字符的下标,直到k >= 字符串.len
  • ③:当k为中间行时,k和d-k为一组,(k,d-k)-->(k+d,d-k+d)-->...,直到k >= 字符串.len

2.3.2 算法代码

class Solution {
    public String convert(String s, int numRows) {
        if (numRows == 1) return s;
        char[] ss = s.toCharArray();
        int len = ss.length;
        StringBuilder stringBuilder = new StringBuilder();
        int d = 2 * numRows - 2;//公差
        for (int i = 0; i < numRows; i++) {
            int k = i;
            if (k == 0) {
                while (k < len) {
                    stringBuilder.append(ss[k]);
                    k += d;
                }
            } else if (k == numRows - 1) {
                while (k < len) {
                    stringBuilder.append(ss[k]);
                    k += d;
                }
            } else {
                int k2 = d - k;
                while (k < len || k2 < len) {
                    if (k < len) stringBuilder.append(ss[k]);
                    if (k2 < len) stringBuilder.append(ss[k2]);
                    k += d;
                    k2 += d;
                }
            }
        }
        return stringBuilder.toString();
    }
}

2.4 外观数列

. - 力扣(LeetCode)

2.4.1 算法思想

外观数列其实就是从2开始(1的外观数列就是1)用口头的语言将前一个数的表述出来,比如:

1 --> 1
2 --> 11(1个1)
3 --> 21(2个1)
4 --> 1211(1个2、1个1)
5 --> 111221(1个1、1个2、2个1)
....

使用双指针法求解:

  1. 从数字以1开始
  2. 定义left和right指针,起始位置均为0下标
  3. 当ret[right] != ret[left]时,记录长度(相同元素的个数),且更新left = right,继续向后遍历,直至遍历完成当前字符串
  4. 更新ret字符串,更新数字,直至数字n,返回数字n的外观数列

2.4.2 算法代码

class Solution {
    public String countAndSay(int n) {
        String ret = "1";
        for(int i = 0; i < n - 1; i++) {
            StringBuilder sb = new StringBuilder();
            int left = 0, right = 0;
            int len = ret.length();
            while(right < len) {
                while(right < len && ret.charAt(right) == ret.charAt(left)) right++;
            sb.append(right - left);
            sb.append(ret.charAt(left));
            left = right;
            }
            ret = sb.toString();
        }
        return ret;
    }
}

2.5 数青蛙

. - 力扣(LeetCode)

2.5.1 算法思想

  • 若下标为1~4的字符(r、o、a、k),则去哈希表中查看其前驱字符,若存在则:前驱个数--,当前字符个数++;若不存在:返回-1
  • 若下标为0的字符(c),说明蛙叫刚刚开始,查看最后一个字符的个数,若存在则:最后一个字符个数--,当前字符个数++;  若不存在则:当前字符++
  • 注意:当遍历完成后,除最后一个字符外,哈希表中仍有其他字符存在个数,则不成立,返回-1

2.5.2 算法代码

class Solution {
    public int minNumberOfFrogs(String croakOfFrogs) {
        char[] s = croakOfFrogs.toCharArray();
        int n = "croak".length();
        int[] hash = new int[n];
        // 绑定字符和其下标
        Map<Character, Integer> map = new HashMap<>();
        for (int i = 0; i < n; i++)
            map.put("croak".charAt(i), i);
        for (char ch : s) {
            int index = map.get(ch);
            if (index == 0) {
                if (hash[n - 1] != 0)
                    hash[n - 1]--;
                hash[0]++;
            } else {
                if (hash[index - 1]-- == 0)
                    return -1;
                hash[index]++;
            }
        }
        //除最后一个字符外,哈希表中仍有其他字符存在个数
        for (int i = 0; i < n - 1; i++) {
            if (hash[i] != 0)
                return -1;
        }
        return hash[n - 1];
    }
}

END

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

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

相关文章

复旦NLP团队新作:大规模语言模型从理论到实践PDF版

2022 年 11 月&#xff0c;Chat GPT 的问世展示了大语言模型的强大潜能&#xff0c;并迅速引起了广泛关注。Chat GPT 能够有效理解用户需求&#xff0c;并根据上下文提供恰当的回答。它不仅可以进行日常对话&#xff0c;还能够完成复杂任务&#xff0c;如撰写文章、回答问题等。…

测试工程师学历路径:从功能测试到测试开发

现在软件从业者越来越多&#xff0c;测试工程师的职位也几近饱和&#xff0c;想要获得竞争力还是要保持持续学习。基本学习路径可以从功能测试-自动化测试-测试开发工程师的路子来走。 功能测试工程师&#xff1a; 1、软件测试基本概念&#xff1a; 学习软件测试的定义、目的…

Cubase里如何使用效果器插件?

Cubase里如何使用效果器插件&#xff1f;具体操作步骤如下&#xff1a; 1、首先&#xff0c;在你的电脑上打开Cubase软件。进入页面后&#xff0c;单击菜单栏上的设备以进入插件管理器&#xff0c;如下所示&#xff0c;然后继续下一步。 2、接下来&#xff0c;弹出插件管理器窗…

银行业智能化转型:智能客服的崛起与挑战

更多内容个人网站&#xff1a;孔乙己大叔 在当今这个科技日新月异的时代&#xff0c;银行业作为传统金融业的支柱&#xff0c;正经历着一场前所未有的变革。智能客服的兴起&#xff0c;不仅重塑了银行的服务模式&#xff0c;也深刻影响着银行员工的职业生涯。这场由技术驱动的变…

遥控器显示分别对应的无人机状态详解!!

1. 电量显示 遥控器电量&#xff1a;遥控器上通常会显示自身的电池电量&#xff0c;以提醒用户及时充电。 无人机电量&#xff1a;部分高端遥控器还会显示无人机的电池电量&#xff0c;以进度条或百分比的形式表示&#xff0c;帮助用户了解无人机的续航能力。 2. 飞行模式与…

24并发设计模式——线程池模式

一、线程池模式介绍 线程池模式&#xff08;Thread Pool Pattern&#xff09;是一种并发设计模式&#xff0c;用于管理和循环使用线程资源以处理大量任务。它旨在提高系统性能和资源利用率&#xff0c;特别是在需要频繁创建和销毁线程的环境中。 1、线程池模式结构图 线程池管…

弱通联条件下的人机混合控制

弱通联条件下的人机混合控制指的是在通信连接不稳定或不可靠的情况下&#xff0c;如何有效地将人工控制与自动化/智能化系统结合起来进行操作。这种情况下&#xff0c;控制系统需要设计得既能在网络问题时维持基本功能&#xff0c;又能充分利用人工输入来补充自动系统的不足。下…

Win10提示输入网络凭据解决方法(Win10 Prompts for Entering Network Credentials Solution)

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

什么?!新版 Node.js V22.5 自带 SQLite 模块啦

前言 2024年7月&#xff0c;Node.js V22.5.0 版本发布&#xff0c;自带了 SQLite 模块&#xff0c;意味着开发者可以直接在程序中使用 SQLite 数据库&#xff0c;而无需引入第三方库&#x1f44d;。 话不多说&#xff0c;感觉来体验一波✈。 安装/升级 我现在用的是21.4.0版…

xss.haozi.me

0x03 审查源码我们发现&#xff0c;括号, 方括号都被过滤了 这段代码是一个简单的 JavaScript 函数&#xff0c;名为 render。它接受一个字符串 input 作为参数&#xff0c;并返回一个新的字符串&#xff0c;其中所有圆括号 ( 和 ) 都被移除了。 函数内部定义了一个正则表达式…

三级_网络技术_58_应用题

一、 请根据下图所示网络结构回答下列问题。 1.填写RG的路由表项。 目的网络/掩码长度输出端口__________S0&#xff08;直接连接&#xff09;__________S1&#xff08;直接连接&#xff09;__________S0__________S1__________S0__________S1 (2)如果在不改变路由表项的前提…

notepad++将换行替换成空

将多行里的换行置为一行&#xff0c;例如将下面的6行置为3行 crrlH打开替换框&#xff0c; 替换目标为【,\r\n】&#xff0c;替换成空&#xff0c;勾选循环查找和 正则表达式&#xff0c;全部替换即可。 替换后的效果

三级_网络技术_59_应用题

一、 请根据下图所示网络结构回答下列问题。 1.填写RG的路由表项。 目的网络/掩码长度输出端口__________S0&#xff08;直接连接&#xff09;__________S1&#xff08;直接连接&#xff09;__________S0__________S1__________S0__________S1 2.如果需要监听该网络内子网10…

SpringBoot 项目集成 xxl-job

1. xxl-job 官网 https://www.xuxueli.com/xxl-job/ 2. git 拉取 xxl-job 源码 2.1 源码仓库地址 https://github.com/xuxueli/xxl-job http://gitee.com/xuxueli0323/xxl-job 2.2 git 拉取源码 git clone https://gitee.com/xuxueli0323/xxl-job.git 2.3 git拉取源码时&…

CSS实现DIV水平展示

CSS实现DIV水平展示 css代码 .container {display: flex; /* 使用 Flexbox */justify-content: space-between; /* 在主轴上均匀排列 */width: 100%; /* 设置容器宽度 */ } .box {flex:1; height:100px; }HTML代码 <div class"container"><div class&quo…

高效智能的AI人工智能对话系统源码,具备强大的自然语言处理能力 带完整的安装代码包以及搭建部署教程

系统概述 随着互联网的普及和大数据时代的到来&#xff0c;人们对信息获取、处理及交互的需求日益增强。传统的界面操作已难以满足快速、便捷、人性化的服务需求&#xff0c;而自然语言处理&#xff08;NLP&#xff09;技术的突破&#xff0c;为构建更加智能的对话系统提供了可…

MASt3R:从3D的角度来实现图像匹配(更新中)

Abstract 图像匹配是 3D 视觉中所有性能最佳算法和pipeline的核心组件。 然而&#xff0c;尽管匹配从根本上来说是一个 3D 问题&#xff0c;与相机姿态和场景几何结构有内在联系&#xff0c;但它通常被视为一个 2D 问题。因为匹配的目标是建立 2D 像素字段之间的对应关系&#…

达梦数据库的系统视图v$ifun_arg

达梦数据库的系统视图v$ifun_arg 在达梦数据库&#xff08;DM Database&#xff09;中&#xff0c;V$IFUN_ARG 系统视图提供了关于存储函数&#xff08;或存储过程&#xff09;参数的详细信息。它是与函数参数相关的系统表&#xff0c;可以帮助数据库管理员和开发人员查看和管…

【重学MySQL】四、关系型数据库设计规则

【重学MySQL】四、关系型数据库设计规则 表、记录、字段设计规则表设计规则记录设计规则字段设计规则 表的关联关系一对一关系&#xff08;One-to-One Relationship&#xff09;一对多关系&#xff08;One-to-Many Relationship&#xff09;多对多关系&#xff08;Many-to-Many…

HTTP代理支持UDP协议吗?

在网络通信中&#xff0c;HTTP代理和UDP协议是两个常见但功能和用途不同的技术。本文将详细探讨HTTP代理是否支持UDP&#xff0c;以及在什么情况下可以实现两者的结合。 HTTP代理的基本概念 HTTP代理是一种代理服务器&#xff0c;用于处理HTTP请求和响应。它在客户端和目标服…