优选算法的巧思之径:模拟专题

news2025/4/2 9:21:09

专栏:算法的魔法世界

个人主页:手握风云

目录

一、模拟

二、例题讲解

2.1. 替换所有的问号

2.2. 提莫攻击

2.3. Z字形变换

2.4. 外观数列

2.5. 数青蛙


一、模拟

        模拟算法说简单点就是照葫芦画瓢,现在草稿纸上模拟一遍算法过程,再把算法过程转化为代码。

二、例题讲解

2.1. 替换所有的问号

        方法中所给的字符串s只含小写字母和问号,我们需要把这个问号转化为某个小写字母,得到一个连续重复字符的新字符串。

        我们先将字符串转化为字符数组,然后从前遍历这个字符数组。当遇到"?"时,从26个英文字母找到第一个既不等与它的前一位有不等于它的后一位的字符。当我们还需要注意一下边界情况,比如"?"在数组的第0位上,前一位不存在,只需要比较后面一位即可。

        完整代码实现:

class Solution {
    public String modifyString(String s) {
        char[] ch = s.toCharArray();
        int n = s.length();
        for (int i = 0; i < n; i++) {
            if(ch[i] == '?'){
                for(char c = 'a';c <= 'z';c++){
                    if((i == 0 || c != ch[i - 1]) && (i == n - 1 || c != ch[i+1])){
                        ch[i] = c;
                        break;
                    }
                }
            }
        }
        return String.valueOf(ch);
    }
}

2.2. 提莫攻击

        艾希受到提莫的攻击,会对艾希造成持续两秒的中毒效果,如果在中毒期间再次受到攻击,那么中毒时间还会重置,题目要求我们输出中毒的总时长。

        ·我们需要遍历一边数组,计算每两个相邻元素的差x,如果x大于等于中毒持续时间duration,则中毒时间ret加上duration;如果x小于duration,则ret直接加上x。但比较容易忽略的一点是数组的最后一个元素没有下一个元素,所以最后的返回值再要加上一个duration。

        完整代码实现:

class Solution {
    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];
            if(x >= duration) ret += duration;
            else ret += x;
        }
        return ret + duration;
    }
}

2.3. Z字形变换

        题目要求我们将给定的字符串变为倒Z排列,然后再以从左到右的顺序输出,得到一个新字符串。我们要想成功模拟出这个过程,需要借助一个矩阵来储存字符。我们以示例1为例,先创建一个n行的矩阵,先向下填充,当x=n时,开始右上填充,当x=0时,又开始向下填充……。假设字符串长度为len,因为我们记得遍历字符串又得遍历矩阵,所以时间复杂度和空间复杂度都为O(len*n)

        我们接下来可以通过找规律来对算法进行优化。如果矩阵里面填充的是字符的下标,那我们就可以发现规律了。第0行和第n-1行的数字正好构成了等差数列,且公差d为2n-2。接下来枚举第1行到第n-1行,1、5、9、13依然是构成了等差数列,3、7、11构成等差数列,(1,3)->(5,7)->(9,11)。

        完整代码:

class Solution {
    public String convert(String s, int numRows) {
        //处理一下边界情况
        if(numRows == 1) return s;
        
        int d = 2 * numRows - 2, n = s.length();
        StringBuilder ret = new StringBuilder();

        //1.处理第一行
        for (int i = 0; i < n; i += d)
            ret.append(s.charAt(i));

        //2.处理中间行
        for (int k = 1; k < numRows - 1; k++) {//一次枚举中间行
            for (int i = k, j = d - i; i < n || j < n; i += d, j += d) {
                if (i < n) ret.append(s.charAt(i));
                if (j < n) ret.append(s.charAt(j));
            }
        }

        //3.处理最后一行
        for (int i = numRows - 1; i < n; i += d) {
            ret.append(s.charAt(i));
        }

        return ret.toString();
    }
}

2.4. 外观数列

        本题的输出结果就是对第n-1的解释,当n=1时,字符串s="1";当n=2时,前一项是1个1,记为"11";当n=3时,前一项是2个1,记为"21";当n=4时,前一项时1个2和1个1,记为"1211"……规律就是对上一项连续相同的字符元素进行分类。

        我们可以利用双指针进行模拟。先初始化两个指针left和right,比较left和right是否相等,相等right就向右移动,当right的指向与left不相等时,right就停止,此时的left直接移动到right的位置。以此循环,直到right移动到字符串的结尾的后一位。前一类元素个数的计算right-1-left+1,作为对上一类元素的解释。

        完整代码实现:

class Solution {
    public String countAndSay(int n) {
        String ret = "1";//先初始化n=1时的字符串

        for (int i = 1; i < n; i++) {
            StringBuilder tmp = new StringBuilder();
            int len = ret.length();
            for (int left = 0,right = 0;right < len;){
                while(right < len && (ret.charAt(left) == ret.charAt(right))) right++;
                tmp.append(Integer.toString(right - left));
                tmp.append(ret.charAt(left));
                left = right;
            }
            ret = tmp.toString();
        }
        return ret;
    }
}

2.5. 数青蛙

        题目要求我们根据给定的字符串,计算出最少需要多少只青蛙才能完成鸣叫的过程。鸣叫的过程必须按照"croak"的顺序进行。比如"croakcroak",一只青蛙先叫完1声,还可以接着叫第2声;"crcoakroak","cr"后面是"c",就需要另一只青蛙开始叫。

        我们先从头到尾遍历一遍字符串,,比如我们遍历到a时,只需确定a的前面是不是r,所以我们还需要一个哈希表来记录每个字符出现的情况。当遍历到c时,哈希表中c加1;如果遍历到r时,检查前一个是不是c,如果是,则c--,r++。重复以上操作,

        如上图,k后面又是c,我们还需要给c记录上1,而我们要求的是所需不同青蛙的最少数目,所以我们从k里面借一个1,再去遍历最后一个"croak",最终k里面存的就是最终结果。当遍历完字符串之后,k前面还有非0元素,说明还有青蛙没有叫完,则返回-1。

        还有一种情况,如果给定的字符串是"crroak",遍历到第二个r时,哈希表中的c为0,直接返回-1。所以我们可以总结出:当r、o、a、k的前驱字符再哈希表时,前驱个数--,当前字符++,不存在直接返回-1;如果是c,找k是否存在于哈希表中,存在前驱个数--,当前字符++,不存在直接返回-1。

        完整代码实现:

class Solution {
    public int minNumberOfFrogs(String croakOfFrogs) {
        char[] croakOf = croakOfFrogs.toCharArray();
        String t = "croak";
        int n = t.length();
        int[] hash = new int[5];

        Map<Character,Integer> index = new HashMap<>();
        for (int i = 0; i < n; i++)
            index.put(t.charAt(i),i);

        for (char ch : croakOf) {
            if(ch == t.charAt(0)) {
                if(hash[n - 1] != 0) hash[n - 1]--;
                hash[0]++;
            }else {
                int i = index.get(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];
    }
}

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

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

相关文章

【云服务器】在Linux CentOS 7上快速搭建我的世界 Minecraft 服务器搭建,并实现远程联机,详细教程

【云服务器】在Linux CentOS 7上快速搭建我的世界 Minecraft 服务器搭建&#xff0c;详细详细教程 一、 服务器介绍二、下载 Minecraft 服务端三、安装 JDK 21四、搭建服务器五、本地测试连接六、添加服务&#xff0c;并设置开机自启动 前言&#xff1a; 推荐使用云服务器部署&…

文本分析(非结构化数据挖掘)——特征词选择(基于TF-IDF权值)

TF-IDF是一种用于信息检索和文本挖掘的常用加权算法&#xff0c;用于评估一个词在文档或语料库中的重要程度。它结合了词频&#xff08;TF&#xff09;和逆文档频率&#xff08;IDF&#xff09;两个指标&#xff0c;能够有效过滤掉常见词&#xff08;如“的”、“是”等&#x…

【JavaSE】小练习 —— 图书管理系统

【JavaSE】JavaSE小练习 —— 图书管理系统 一、系统功能二、涉及的知识点三、业务逻辑四、代码实现4.1 book 包4.2 user 包4.3 Main 类4.4 完善管理员菜单和普通用户菜单4.5 接着4.4的管理员菜单和普通用户菜单&#xff0c;进行操作选择&#xff08;1查找图书、2借阅图书.....…

多线程(多线程案例)(续~)

目录 一、单例模式 1. 饿汉模式 2. 懒汉模式 二、阻塞队列 1. 阻塞队列是什么 2. 生产者消费者模型 3. 标准库中的阻塞队列 4. 自实现阻塞队列 三、定时器 1. 定时器是什么 2. 标准库中的定时器 欢迎观看我滴上一篇关于 多线程的博客呀&#xff0c;直达地址&#xf…

一个判断A股交易状态的python脚本

最近在做股票数据相关的项目&#xff0c;需要用到判断某一天某个时刻A股的状态&#xff0c;比如休市&#xff0c;收盘&#xff0c;交易中等&#xff0c;发动脑筋想了一下&#xff0c;这个其实还是比较简单的&#xff0c;这里我把实现方法分享给大家。 思路 当天是否休市 对于某…

闪记(FlashNote):让灵感快速成文的轻量级笔记工具

闪记&#xff08;FlashNote&#xff09;&#xff1a;让灵感快速成文的轻量级笔记工具 你是否经常遇到这样的情况&#xff1a;桌面上放了一大堆的新建123.txt&#xff0c;想记录一个想法&#xff0c;应该是一键开个一个快捷键然后瞬间记录就自动保存了&#xff0c;现在的很多笔记…

《大模型部署》——ollama下载及大模型本地部署(详细快速部署)

ollama Ollama 是一款开源跨平台的大语言模型&#xff08;LLM&#xff09;运行工具&#xff0c;旨在简化本地部署和管理 AI 模型的流程。 下载ollama 进入官网下载https://ollama.com/ 选择需要的系统下载 下载完成后直接进行安装 下载大模型 选择想要部署的模型&#…

Geotools结合SLD实现矢量中文标注下的乱码和可用字体解析

目录 前言 一、需求溯源 1、原始的SLD渲染 2、最初的效果 二、问题修复 1、还是字符编码 2、如何选择可用的字体 3、如何查看支持的字体库 三、总结 前言 随着地理信息系统&#xff08;GIS&#xff09;技术的不断发展&#xff0c;矢量数据的可视化和标注成为了地理信息展…

基于Python与CATIA V5的斐波那契螺旋线自动化建模技术解析

引言 斐波那契螺旋线&#xff08;Fibonacci Spiral&#xff09;作为自然界广泛存在的黄金比例曲线&#xff0c;在工业设计、产品造型、机械工程等领域具有重要应用价值。本文将以Python控制CATIA V5进行参数化建模为例&#xff0c;深入解析三维CAD环境中复杂数学曲线的自动化生…

动态规划(11.按摩师)

题目链接&#xff1a;面试题 17.16. 按摩师 - 力扣&#xff08;LeetCode&#xff09; 解法&#xff1a; 状态表示&#xff1a; 对于简单的线性 dp &#xff0c;我们可以⽤「经验 题⽬要求」来定义状态表⽰&#xff1a; 以某个位置为结尾&#xff0c;巴拉巴拉&#xff1b;…

CentOS下安装Docker,Docker下安装JDK\MYSQL\REDIS\NGINX

先用VM安装好Centos8.5&#xff0c;可以选择安装迷你版&#xff0c;我安装的是UI版。 然后用MobaXterm_Portable_v23.0_cn连上去&#xff0c;互访成功就可以往下操作。 1. 修改文件&#xff1a;就是要把之前的mirror替换成现在的vault cd /etc/yum.repos.d/sed -i s/mirrorl…

demo.launch(inbrowser=True, share=True)无法生成共享网址

Gradio 的共享功能无法正常工作&#xff0c;原因是缺少一个名为 frpc_windows_amd64_v0.3 用到代码 app.demo.launch(show_errorTrue, inbrowserTrue, shareTrue) show_errorTrue&#xff1a;这个参数的作用是当应用在启动过程中出现错误时&#xff0c;会显示错误信息。这对于调…

翻译: 人工智能如何让世界变得更美好二

Basic assumptions and framework 基本假设和框架 To make this whole essay more precise and grounded, it’s helpful to specify clearly what we mean by powerful AI (i.e. the threshold at which the 5-10 year clock starts counting), as well as laying out a fram…

【vue】editor富文本输入全英文,谷歌浏览器:元素不会自动换行bug

【vue】editor富文本输入全英文&#xff0c;谷歌浏览器&#xff1a;元素不会自动换行bug 解决方案&#xff1a;给元素一个宽度 100% .editor {width: 100%; }

# OpenCV实现人脸与微笑检测:从图像到视频的实战应用

OpenCV实现人脸与微笑检测&#xff1a;从图像到视频的实战应用 在计算机视觉领域&#xff0c;人脸检测和微笑检测是两个非常有趣且实用的任务。它们广泛应用于智能监控、社交媒体分析、人机交互等多个场景。本文将通过两个代码示例&#xff0c;详细介绍如何使用OpenCV实现人脸…

Kubernetes可视化面板——KubePi(Kubernetes Visualization Panel - kubepi)

Kubernetes可视化管理面板——KubePi 在云计算和容器化的大潮下&#xff0c;Kubernetes 已成为管理容器集群的事实标准。然而&#xff0c;面对复杂的集群管理和运维工作&#xff0c;一个直观、易用的可视化工具显得至关重要。KubePi 正是为此而生——一款专为简化 Kubernetes …

【区块链安全 | 第二十三篇】单位和全局可用变量(一)

文章目录 单位和全局可用变量&#xff08;Units and Globally Available Variables&#xff09;以太单位&#xff08;Ether Units&#xff09;时间单位&#xff08;Time Units&#xff09;保留关键字 单位和全局可用变量&#xff08;Units and Globally Available Variables&am…

权重参数矩阵

目录 1. 权重参数矩阵的定义与作用 2. 权重矩阵的初始化与训练 3. 权重矩阵的解读与分析 (1) 可视化权重分布 (2) 统计指标分析 4. 权重矩阵的常见问题与优化 (1) 过拟合与欠拟合 (2) 梯度问题 (3) 权重对称性问题 5. 实际应用示例 案例1&#xff1a;全连接网络中的…

【现代深度学习技术】现代卷积神经网络06:残差网络(ResNet)

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈PyTorch深度学习 ⌋ ⌋ ⌋ 深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上&#xff0c;结合当代大数据和大算力的发展而发展出来的。深度学习最重…

《异常检测——从经典算法到深度学习》30. 在线服务系统中重复故障的可操作和可解释的故障定位

《异常检测——从经典算法到深度学习》 0 概论1 基于隔离森林的异常检测算法 2 基于LOF的异常检测算法3 基于One-Class SVM的异常检测算法4 基于高斯概率密度异常检测算法5 Opprentice——异常检测经典算法最终篇6 基于重构概率的 VAE 异常检测7 基于条件VAE异常检测8 Donut: …