模拟算法系列|替换所有的问号|提莫攻击|种花问题|Z字形变换|兼具大小写的英文字母|删除字符使频率相同

news2024/9/20 1:09:13

大家好,我是LvZi,今天带来模拟算法系列|替换所有的问号|提莫攻击|种花问题|Z字形变换|兼具大小写的英文字母|删除字符使频率相同
在这里插入图片描述

一.基本概念

模拟算法就是根据题意 模拟出代码的过程,模拟算法的题意往往都很简单,考验的是将思路转化为代码的能力,十分的锻炼代码能力,且能很好的培养分类讨论的思想

关于模拟算法的提高,最重要的就是多刷题,多看题解 ,积累足够多的经验

二.例题讲解

01.替换所有的问号
链接:https://leetcode.cn/problems/replace-all-s-to-avoid-consecutive-repeating-characters/
分析

  • 题意很简单,就是将所有的?替换为其他字符,要求替换后不存在连续重复的字符
  • 本题采用分类讨论的思想,假设?的下标为i,根据i的位置可以分为三类
  • i == 0:成立条件:tmp != s[1]
  • i == n - 1:成立条件:tmp != s[n - 2]
  • 0 < i < n - 1:成立条件:tmp != s[i - 1] && tmp != s[i + 1]

代码:

class Solution {
    public String modifyString(String ss) {
        // 模拟实现
        int n = ss.length();
        if (n == 1) return "a";
        char[] s = ss.toCharArray();
        for (int i = 0; i < n; i++) {
            char ch = s[i];
            if (ch == '?') {
                for (char tmp = 'a'; tmp <= 'z'; tmp++) {
                    if (i == 0) {
                        if(tmp != s[i + 1]) s[i] = tmp;
                    } else if (i == n - 1) {
                        if(tmp != s[n - 2]) s[i] = tmp;
                    } else {
                        if(tmp != s[i - 1] && tmp != s[i + 1]) s[i] = tmp;
                    }
                }
            }
        }

        return new String(s);
    }
}

02.提莫攻击
链接:https://leetcode.cn/problems/teemo-attacking/
分析

  • 分类讨论,可分为两种情况
  • 1.当前时间并未中毒 无需重置时间
  • 2.当前时间处于中毒时间 需要重置时间

代码:

class Solution {
    public int findPoisonedDuration(int[] timeSeries, int d) {
        int n = timeSeries.length, ret = d;
        for(int i = 1; i < n; i++) {
            if(timeSeries[i] <= timeSeries[i - 1] + d) {
                ret += (timeSeries[i] - timeSeries[i - 1]);// 中毒  重置时间
                continue;
            }
            ret += d;// 未中毒
        }

        return ret;
    }
}

03.种花问题
链接:https://leetcode.cn/problems/can-place-flowers/
分析

  • 跳格子问题,为了尽可能的将所有花都种植,采用的策略应该是"找离得最近的可以种花的位置"
  • 边界处理十分麻烦,但是我们可以扩充数组,类似于二维数组经常使用的扩增一行一列的方式来进行初始化,减少边界条件的判断

代码:

class Solution {
    public boolean canPlaceFlowers(int[] flowerbed, int n) {
        // 为了简化判断的逻辑我们经常使用的优化技巧就是"扩增原数组"
        // 最经常用于dp问题
        // 在本题中有两个边界条件  i==0和i==m- 1
        // 为了防止越界,前后各添加一个0
        int[] a = new int[flowerbed.length + 2];
        for(int i = 1; i <= flowerbed.length; i++) a[i] = flowerbed[i - 1];
        for (int i = 1; i < a.length - 1; i++) {
            if (a[i - 1] == 0 && a[i] == 0 && a[i + 1] == 0) {
                a[i] = 1; // 种花!
                n--;
            }
        }
        return n <= 0;
    }
}


04.Z字形变换
链接:https://leetcode.cn/problems/zigzag-conversion/description/
分析

  • 找规律的题目
    在这里插入图片描述
  • 为了更方便起见,将字符串的长度+1

代码:

class Solution {
    public String convert(String ss, int numRows) {
        if(ss.length() == 1 || numRows == 1) return ss;// 长度为1  或者不需要进行Z字形变换
        String s = " " + ss;
        char[] str = s.toCharArray();
        StringBuilder sb = new StringBuilder();
        int stap = 2 * numRows - 2, n = str.length;
        // 处理第一行
        for(int i = 1; i < n; i += stap) sb.append(str[i]);
        // 处理中间行
        for(int i = 2; i <= numRows - 1; i++) {
            int n1 = i, n2 = 2 * numRows - i;
            while(n1 < n) {
                sb.append(str[n1]);
                if(n2 < n) sb.append(str[n2]);
                n1 += stap; n2 += stap;
            }
        }
        // 处理最后一行
        for(int i = numRows; i < n; i += stap) sb.append(str[i]);
        return sb.toString();
    }
}

注意:这里踩了一个坑,测试用例一直显示超出内存限制,刚开始以为是写了死循环,一直检查循环的条件是否正确,但是发现并不存在错误,又打开idea进行测试,发现也没错误;看了题解才发现是由于特殊condition的存在,比如只有一个字符,或者numRows == 1,第二种情况才是导致超出内存限制的罪魁祸首,此时stap == 0,所以会造成死循环,超出内存限制,写这种题目一定要考虑好特殊情况


05.兼具大小写的英文字母
链接:https://leetcode.cn/problems/greatest-english-letter-in-upper-and-lower-case/description/
分析

  • 使用hash统计字符串s中每一个字符出现的次数,然后遍历判断每一个字符是否大小写都存在,如果存在,返回最大的那个

代码

class Solution {
    public String greatestLetter(String s) {
        // 不需要傻傻的去比较大小  直接从最大的字母Z开始遍历即可
        int[] hash = new int[128];
        for(char ch : s.toCharArray()) hash[ch]++;
        for(char ch = 'Z'; ch >= 'A'; ch--)
            if(hash[ch] >= 1 && hash[ch + 32] >= 1)
                return "" + ch;

        return "";
    }
}
  • 方法2:使用位运算
  • 采用位图的思想,使用mask1的二进制位上的0和1表示小写字母是否出现过,使用mask2的二进制位上的0和1表示大写字母是否出现过

代码

class Solution {
    public String greatestLetter(String s) {
        int mask1 = 0, mask2 = 0;
        for(char ch : s.toCharArray()) {
            if(ch >= 'a' && ch <= 'z') mask1 |= (1 << (ch - 'a'));
            else mask2 |= (1 << (ch - 'A'));
        }

        int mask = mask1 & mask2;
        for(int i = 31; i >= 0; i--) {
            if(((1 << i) & mask) != 0) return "" + ((char)('A' + i));
        }
        return "";
    }
}

06.删除字符使频率相同
链接:https://leetcode.cn/problems/remove-letter-to-equalize-frequency/
分析
思路:

  1. 统计每个字符出现的频率
  2. 建立"频率--出现次数"的映射关系
  3. 分类讨论
    • 只有一种频率:此时仅有一种condition不符合条件,当频率为偶数且频率出现的次数也为偶数,形如aabb这种
    • 存在两种频率:此时有两种符合条件的情况;
      • 其中一个频率为1,且出现次数为1
      • 其中一个频率比另一个频率大1,且次频率的出现次数也为1
    • 其他频率:都不符合情况

代码:

class Solution {
    public boolean equalFrequency(String word) {
        // 1.统计所有字符出现的频率
        int[] hash1 = new int[128];
        for(char ch : word.toCharArray()) hash1[ch]++;

        // 2.建立"频率--出现次数"的映射关系
        Map<Integer, Integer> hash2 = new HashMap<>();
        for(int x : hash1) {
            if(x != 0) 
                hash2.put(x, hash2.getOrDefault(x, 0) + 1);
        }

        // 3.分类讨论结果
        // 频率只有一种  
        if(hash2.size() == 1) {
            for(Integer key : hash2.keySet()) {
                if(key % 2 == 0 && hash2.get(key) > 1) return false;
                return true;
            }
        }

        // 频率有两种
        if(hash2.size() == 2) {
            int[] key = new int[2], val = new int[2];
            int index = 0;
            for(Map.Entry<Integer, Integer> entries : hash2.entrySet()) {
                key[index] = entries.getKey();
                val[index] = entries.getValue();
                ++index;
            }

            if((key[0] == 1 && val[0] == 1)||(key[1] == 1 && val[1] == 1)) return true;
            if((key[0] - key[1] == 1 && val[0] == 1)||(key[1] - key[0] == 1 && val[1] == 1)) return true;
        }

        // 其余频率都不满足情况
        return false;
    }
}

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

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

相关文章

大模型学习笔记1【大模型】

文章目录 学习内容0.大模型应用的流程1.构建任务/领域的数据集2.寻找备选模型3.调整模型PromptFine-tuningPEFT RLHF 学习内容 根据自己的经验和课程的学习&#xff0c;系统的记录一下大模型落地的流程。 0.大模型应用的流程 构建任务/领域问题数据集使用对应任务的语料测试…

“党建链串起产业链“ —— 亦企港携手企业共赴天空卫士探索数据安全新篇章

在数字化浪潮的推动下&#xff0c;数据安全已成为国家发展的关键。北京经济技术开发区&#xff08;简称北京经开区&#xff09;通过创新的“党建链串起产业链”活动&#xff0c;不断探索党建工作与产业发展的双向促进模式&#xff0c;为企业提供政策支持和资源共享&#xff0c;…

【课程设计】基于python的一款简单的计算器

我们是大二本科生团队&#xff0c;主力两人耗时3天完成了这款计算器的制作。希望大家给我们多多引流&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 欢迎各位优秀的高考学子报考长安大学&#xff0c;报考长安大学电子信息工程专业。 欢迎有志于就…

手机数据恢复篇:如何从损坏的iPhone恢复数据

不知道如何在没有备份的情况下从损坏的iPhone恢复数据&#xff1f;阅读本文&#xff0c;您可以获得从损坏的iPhone中提取数据的详细步骤。 可能很多苹果用户都经历过上述场景带来的痛苦。意外事件经常发生&#xff0c;例如 iPhone 被液体损坏并从高处掉落。面对无响应的屏幕&a…

3DMAX选择相似对象插件使用方法

3DMAX选择相似对象插件使用教程 3DMAX选择相似对象插件&#xff0c;允许你选择与当前选定对象相似的对象。它将比较当前可见对象或场景中所有对象内的边界框大小、网格&#xff08;顶点、面、边数&#xff09;和材质。 【版本要求】 3dMax7及更高版本&#xff08;建议使用3dMa…

线性代数笔记

行列式 求高阶行列式 可以划上三角 上三角 余子式 范德蒙行列式 拉普拉斯公式 行列式行列对换值不变 矩阵 矩阵的运算 同型矩阵加减 对应位置相加减 矩阵的乘法 左边第 i 行 一次 相乘求和 右边 第 j 列 eg 中间相等 两边规模 矩阵的幂运算 解题思路 找规律 数学归纳…

基于大语言模型建模改变法律服务是否在速度和准确性上超越人类?

概述 人工智能&#xff08;AI&#xff09;在法律行业的发展为法律服务创造了新的可能性。然而&#xff0c;关于使用生成式人工智能和大规模语言模型&#xff08;LLM&#xff09;解决和发现法律问题的研究仍有很大的探索空间。尤其关键的是&#xff0c;要了解这些先进技术是如何…

生命在于学习——Python人工智能原理(3.2.1)

二、随机变量 2.1 随机变量及其分布 &#xff08;一&#xff09;基本概念 定义1 随机变量 随机变量表示随机试验各种结果的实值单值函数&#xff0c;即能用数学分析方法来研究随机现象&#xff0c;例如某一时间内公共汽车站等车的乘客人数、淘宝在一定时间内的交易次数等&am…

MySQL学习(5):SQL语句之数据查询语言:DQL

1.DQL语法 select 字段列表 from 表名列表 #DQL是可以进行多表查询的 where 条件列表 group by 分组字段列表 having 分组后条件列表 order by 排序字段列表 limit 分页参数 2.基本查询&#xff08;select&#xff09; 2.1查询多字段 select 字段1,字段2,字段3,......fro…

AI+BI:结合大语言模型实现对话式的智能报表系统

转自&#xff1a;AI产品经理研习与实践 引言&#xff1a;BI是什么、AI大语言模型结合BI有什么优势 AIBI的不同模式&#xff1a;主要关注在数据查询分析&可视化呈现环节 AIBI的实施挑战 产品实践&#xff1a;包括网易、百度、京东、腾讯以及观远数据、神策数据在AIBI上的…

vscode移动侧边栏到右边

vscode移动侧边栏到右边&#xff0c;的简单办法 直接在侧栏上单击右键&#xff0c;选择向右移动主侧栏

基于Hadoop平台的电信客服数据的处理与分析④项目实现:任务18: 数据展示

任务描述 接下来我们需要将根据业务需求将某人按照不同维度查询出来的结果&#xff0c;展示到Web页面上。 任务指导 数据展示模块流程图&#xff1a; 数据展示使用Java的SSM框架&#xff0c;需要实现的代码包括&#xff1a; 1. 实体类 2. 数据库操作 3. 业务逻辑操作 4.…

Java程序设计课后习题(答案版) 期末复习

第一章 Java语言概述 一、选择题 下面哪种类型的文件可以在Java虚拟机中运行?( A ) A. class B. Java C. jre D. exe 如果JDK 的安装路径为“d:\jdk”&#xff0c;若想在命令窗口中任何当前路径下&#xff0c;都可以直接使用javac和java命令&#xff0c;需要将环境变量path设…

vue实现搜索文章关键字,滑到指定位置并且高亮

1、输入搜索条件&#xff0c;点击搜索按钮 2、滑到定位到指定的搜索条件。 <template><div><div class"search_form"><el-inputv-model"searchVal"placeholder"请输入关键字查询"clearablesize"small"style&quo…

LaySNS模板仿RiPro日主题素材源码资源下载响应式CMS模板

LaySNS模板仿RiPro日主题素材源码资源下载响应式CMS模板&#xff0c;该主题是网上泛滥的RiPro主题仿制而成的laysns模板&#xff0c;原主题是很强大的。 全站功能是通过ajax响应实现的&#xff0c;另外就是网上流传得比较多的是美化版。 主要说明&#xff1a;付费/回复下载功…

三爱法国高中留学:开启全球视野的黄金之路

综合素质培养 : 全面发展的教育体系 法国高中课程以其全面而严谨的教育体系闻名全球。学生不仅学习到丰富的学科知识,如法语及文学、外语、科学、历史地理、哲学和体育等,还通过独特的教学方法培养独立思考和批判性思维能力。法国是全球唯一将哲学纳入中学必修课程的国家,这种…

物流行业:智能物流跟踪

在现代物流中&#xff0c;RFID技术的应用已经成为提高运输效率和安全性的重要手段。RFID标签可以被轻松地附加到货物上&#xff0c;并能够实时记录物品的位置和状态。通过这些标签&#xff0c;物流公司可以实时追踪货物的运输路径&#xff0c;监控货物的运输状况&#xff0c;确…

Android MQTT 反复重连故障

一、检查是否断开&#xff0c;在不用mqtt地方调用disconnect. /*** 断开Mqtt连接*/public static void disconnect() {try {if (mqttAndroidClient ! null) {String topic PUBLISH_TOPIC devicesId;if (mqttAndroidClient.isConnected()){mqttAndroidClient.unsubscribe(topi…

深圳AI绘画模型训练外包服务公司

&#x1f680; 最强AI绘画、图片生成技术服务公司出炉 —— 触站AI&#xff0c;智能图像的革新工坊 &#x1f3a8; 在AI技术的浪潮中&#xff0c;触站AI以其专业和创新&#xff0c;成为企业AI图像领域的技术解决方案服务先锋。 &#x1f6e0;️ 第一&#xff1a;触站AI&#x…

前端进阶:Vue.js

目录 框架&#xff1a; 助解&#xff1a; 框架&#xff1a; VUE 什么是Vue.js? Vue.js优点 Vue安装 方式一&#xff1a;直接用<script>引入 方式二&#xff1a;命令行工具 第一个Vue程序 代码 代码解释&#xff1a; 运行 Vue指令 v-text v-html v-tex…