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

大家好,我是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// 为了防止越界,前后各添加一个0int[] 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.mzph.cn/bicheng/39600.shtml

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

相关文章

【日记】在街上跳舞被同事看见了(470 字)

正文 昨晚跳舞&#xff0c;照例在街上表演&#xff0c;被单位里的保洁阿姨撞见了…… 我以为这就完了&#xff0c;结果她还拍了视频发给做饭阿姨。晚上吃饭无意间聊起才知道有这回事。我竟一时间不知该哭还是该笑……. 今天非常非常闲。虽然不是没工作&#xff0c;只是我懒得去…

418天内第6次发布,科大讯飞星火大模型在跟谁赛跑?

常言道“一步慢&#xff0c;步步慢”&#xff0c;大模型市场瞬息万变&#xff0c;快人一步就是竞争的反转。 6月27日&#xff0c;科大讯飞如期公布星火大模型的最新进展&#xff1a;大模型底座七大核心能力得到全面提升&#xff0c;星火大模型V4.0可对标GPT-4 Turbo&#xff0…

软考系统架构师高效备考方法论

软考系统架构师高效备考方法论 本章总结的备考方法论也是希望能帮助更多的小伙伴高效的备考最终通过考试&#xff0c;这种考试个人感觉是尽量一次性考过&#xff0c; 要不然老拖着&#xff0c;虽然每年可以考两次&#xff0c;5月和11月&#xff0c;两次考试间隔5个月时间&#…

ELK日志实时监控

目录 一、ELK/EFK简介 1.1 什么是ELK/EFK? 1.2 常见架构 1、Elasticsearch Logstash Kibana 2、Elasticsearch Logstash Filebeat Kibana 3、Elasticsearch Logstash Filebeat Kibana Redis 4、Elasticsearch Fluentd Filebeat Kibana 1.3 基本流程 二、…

JVM专题之垃圾收集算法

标记清除算法 第一步:标记 (找出内存中需要回收的对象,并且把它们标记出来) 第二步:清除 (清除掉被标记需要回收的对象,释放出对应的内存空间) 缺点: 标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致以后在程序运行过程中需 要分配较大对象时,无法找到…

反射--通俗易懂

一、反射(Reflection) 反射就是:加载类&#xff0c;并允许以编程的方式解剖类中的各种成分(成员变量、方法、构造器等) 动态语言&#xff0c;是一类在运行时可以改变其结构的语言&#xff1a;例如新的函数、对象、甚至代码可以被引进&#xff0c;已有的函数可以被删除或是其他…

多重奖励拿到手软,OPENAIGC开发者大赛燃爆这个夏天!

你是否渴望在AI领域一展身手&#xff1f; 你是否拥有开创性的技术和创意&#xff1f; 2024 OPENAIGC开发者大赛就是你的最佳舞台&#xff01; 不论你是经验丰富的开发者&#xff0c; 还是技术领域的创新者&#xff0c; 都有机会在这里大放异彩&#xff01; 由联想拯救者、…

每日一题 7月1日

1 设数组data[m]作为循环队列的存储空间,front为队头指针,rear为队尾指针,则执行出队操作后其头指针front值为____ 2 采用滑动窗口机制对两个相邻结点A(发送方)和B(接收方)的通信过程进行流量控制。假定帧的序号长度为3比特,发送窗口与接收窗口的大小均为7,当A发送了…

分析Profiler Timeline中的算子序列,通过寻找频繁项集的办法,得到TOPK可融合的算子序列

分析Profiler Timeline中的算子序列,通过寻找频繁项集的办法,得到TOPK可融合的算子序列 1.相关链接2.代码【仅分析带通信算子的Pattern】3.在实际工程中发现 [all_gather, matrix_mm_out]频率最高4.[Ascend MC2](https://gitee.com/ascend/MindSpeed/blob/master/docs/features…

1:25万基础电子地图(西藏版)

我们为你分享过四川版、云南版、江西版、贵州版、重庆版和青海版的1比25万基础电子地图&#xff0c;现在再为你分享西藏版的电子地图。 如果你需要西藏版的1比25万基础电子地图&#xff0c;你可以在文末查看该数据的领取方法。 基础电子地图西藏版 西藏版1:25万基础电子地图…

压缩pdf文件大小,压缩pdf文件大小软件哪个好

在数字化时代&#xff0c;PDF文件因其卓越的跨平台兼容性和稳定性而成为工作与学习的好帮手。然而&#xff0c;当PDF文件体积过大时&#xff0c;传输和存储便成了一项挑战。别担心&#xff0c;本文将为你揭秘如何快速压缩PDF文件&#xff0c;让你的文档轻装上路&#xff01; 压…

postman请求访问:认证失败,无法访问系统资源

1、使用postman时&#xff0c;没有传入相应的token&#xff0c;就会出现这种情况&#xff0c;此时需要把token放进去 发现问题: { "msg": "请求访问&#xff1a;/getInfo&#xff0c;认证失败&#xff0c;无法访问系统资源", "code": 401 } 1…

Monorepo(单体仓库)与 MultiRepo(多仓库): Monorepo 单体仓库开发策略与实践指南

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 一、引言1. Monorepo 和 MultiRepo 简介2. 为什么选择 Monorepo&#xff1f; 二、Monorepo 和 MultiRepo 的区别1. 定义和概述2. 各自的优点和缺点3. 适用场景 三、Monorepo 的开发策略1. 版本控制2. 依赖管理3. 构建和发布…

python-切片、集合

序列是指&#xff1a;内容连续、有序&#xff0c;可使用下标索引的一类数据容器 序列的常用操作 - 切片 切片的语法 序列的常用操作 - 切片 注意切片的范围是左闭右开 为什么使用集合 集合的常用操作 - 修改 集合的常用操作 - 集合长度 集合常用功能总结 集合的特点

程序员鱼皮的写简历指南(保姆级)2、简历优化

大家好&#xff0c;我是程序员鱼皮。做知识分享这些年来&#xff0c;我看过太多简历、也帮忙修改过很多的简历&#xff0c;发现很多同学是完全不会写简历的、会犯很多常见的问题&#xff0c;不能把自己的优势充分展示出来&#xff0c;导致措施了很多面试机会&#xff0c;实在是…

AI时代来临,程序员如何应对AI挑战?

随着 AI 技术的飞速发展&#xff0c;特别是大模型的出现&#xff0c;传统的程序员角色正在经历深刻的变革&#xff0c;AI 已经对现有的软件开发模式和程序员的工作模式造成了冲击&#xff0c;并且大语言模型在某些特定语言内的表现甚至超过了大部分的程序员。 但人工智能没有情…

深度学习——卷积神经网络(convolutional neural network)CNN详解(一)——概述. 步骤清晰0基础可看

在CNN的学习过程中我会提供相应的手算例子帮助理解训练过程。 其他关于神经网络的学习链接如下&#xff1a; 一、了解卷积神经网络 卷积神经网络的作用 总的来说&#xff0c;卷积神经网络的第一个主要作用是对图像进行特征提取&#xff0c;所谓特征提取&#xff0c;就是明白…

java入门-基础语法(运算符)

运算符是对变量、字面量进行运算的 符号 &#xff08;一&#xff09;基本的算术运算符、符号做连接符 &#xff08;1&#xff09;基本运算符&#xff1a;(加)&#xff0c; - &#xff08;减&#xff09;、 * &#xff08;乘&#xff09;、 / &#xff08;除&#xff09;、%&…

有哪些好的 Stable Diffusion 提示词(Prompt)可以参考?

Docker 作图咒语生成器 docker-prompt-generator 是一个开源项目&#xff0c;可以利用模型反推出提示词&#xff0c;让你偷偷懒&#xff0c;无需琢磨怎么写prompt&#xff0c;只需要找一个差不多的模型反推一下&#xff0c;直接用就好了&#xff0c;支持支持 MidJourney、Stab…

linux中的进程以及进程管理

程序和进程的区别和联系 程序&#xff08;Program&#xff09;&#xff1a; 程序是一组指令的集合&#xff0c;通常存储在磁盘或其他存储设备上&#xff0c;是一种静态的概念。程序本身并没有运行&#xff0c;它只是一个可执行的文件或脚本&#xff0c;包含了一系列的指令和数…