基础算法(6)——模拟

1. 替换所有的问号

题目描述:

算法思路:

从前往后遍历整个字符串,找到问号之后,尝试用 a ~ z 的每一个字符替换即可

注意点:需考虑数组开头和结尾是问号的边界情况

代码实现:

class Solution {public String modifyString(String ss) {char[] s = ss.toCharArray();int n = s.length;for (int i = 0; i < n; i++) {if (s[i] == '?') {for (char ch = 'a'; ch <= 'z'; ch++) {// 此处判断条件要考虑边界情况if ((i == 0 || ch != s[i - 1]) && (i == n - 1 || ch != s[i + 1])) {s[i] = ch;break;}}}}return String.valueOf(s);}
}

2. 提莫攻击

题目描述:

算法思路:

代码实现:

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

3. Z 字形变换

题目描述:

解法一:模拟

算法思路:

代码实现:

这是东拼西凑写的,哪里报错改哪里,参考价值不大

class Solution {public static String convert(String s, int numRows) {int n = s.length();// 处理边界if (numRows == 1 || numRows >= n) return s;char[][] ret = new char[n][n];int x = 0;int y = 0;//将字符串填入矩阵中for (int i = 0; i < n; i++) {if (x < numRows) { // 当 x < numRows 时,向下移动ret[x][y] = s.charAt(i);x++;} else { // 向右上移动x--; // 因为上面 x++ 导致 x==numRows,所以此处--while (x != 0) {x--;y++;ret[x][y] = s.charAt(i);i++;if (i >= n) break; // 防止越界}x++; // 这里两步不知道为什么i--;}}// 将矩阵中数据添加到 ans 中StringBuilder ans = new StringBuilder();for (int i = 0; i < ret.length; i++) {for (int j = 0; j < ret.length; j++) {if (ret[i][j] != 0) {ans.append(ret[i][j]);}}}return ans.toString();}
}

解法二:找规律

算法思路:

代码实现:

class Solution {public String convert(String s, int numRows) {// 处理边界条件(若 numRows 等于 1,会造成死循环)if (numRows == 1) return s;int d = 2 * numRows - 2;int 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();}
}

4. 外观数列

题目描述:

解法:模拟 + 双指针

算法思路:

代码实现:

class Solution {public String countAndSay(int n) {String str = "1";for (int i = 1; i < n; i++) { // 由于循环从 1 开始,所以仅需解释 n-1 次即可StringBuilder ret = new StringBuilder();int len = str.length();//依次统计字符串中连续且相同的字符的个数for (int left = 0, right = 0; right < len; ) {while (right < len && str.charAt(left) == str.charAt(right)) right++;ret.append(right - left);ret.append(str.charAt(left));left = right; //  添加完之后,将 left 移动到 right 位置}str = ret.toString();}return str;}
}

5. 数青蛙

题目描述:

解法一:暴力实现

// 解法一:模拟实现,适用于解决“蛙鸣 croak” 长度少的题目
class Solution1 {public int minNumberOfFrogs(String croakOfFrogs) {char[] chars = croakOfFrogs.toCharArray();int n = chars.length;int c, r, o, a, k;c = 0; r = 0; o = 0; a = 0; k = 0;int ret = 0;for (int i = 0; i < n; i++) {if (chars[i] == 'c') {if (k > 0) k--;else ret++;c++;} else if (chars[i] == 'r') {c--; r++;} else if (chars[i] == 'o') {r--; o++;} else if (chars[i] == 'a') {o--; a++;} else if (chars[i] == 'k') {a--; k++;}if (c < 0 || r < 0 || o < 0 || a < 0) {return -1;}}if (c != 0 || r != 0 || o != 0 || a != 0) {return -1;}return ret;}
}

解法二:结合哈希表

算法思路:

当遇到 'r' 'o' 'a' 'k' 这四个字符的时候,去看看每个字符对应的前驱字符,有没有青蛙叫出来,若有,则让青蛙喊出当前字符,否则直接返回 -1

当遇到 'c' 这个字符时,去看看 'k' 这个字符有没有青蛙叫出来,若有,则让喊完 'k' 的青蛙来喊 'c',否则重新搞一个青蛙来喊 'c'

总结:

当遇到 'r' 'o' 'a' 'k' 这四个字符的时候,找一下前驱字符是否在哈希表中

  • 若存在,前驱个数--,当前字符++
  • 若不在,返回-1

当遇到 'c' 字符,找最后一个字符是否在哈希表中存在

  • 若存在,最后一个字符--,当前字符++
  • 若不在,当前字符++

代码实现:

//解法二:模拟,用哈希表实现,适用于类似的所有题目
class Solution {public int minNumberOfFrogs(String croakOfFrogs) {char[] chars = croakOfFrogs.toCharArray();String t = "croak";int n = t.length();int[] hash = new int[n];Map<Character, Integer> index = new HashMap<>();for (int i = 0; i < n; i++) {index.put(t.charAt(i), i);}for (char ch : chars) {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.mzph.cn/bicheng/56502.shtml

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

相关文章

《深度学习》OpenCV FisherFaces算法人脸识别 原理及案例解析

目录 一、FisherFaces算法 1、什么是FisherFaces算法 2、原理 3、特点 4、算法步骤 1&#xff09;数据预处理 2&#xff09;特征提取 3&#xff09;LDA降维 4&#xff09;特征投影 5&#xff09;人脸识别 二、案例解析 1、完整代码 运行结果&#xff1a; 一、Fish…

Java 深度优先搜索

深度优先搜索&#xff08;Depth-First Search, DFS&#xff09;是一种用于遍历或搜索树或图的算法。在Java中&#xff0c;可以使用递归或迭代的方法来实现DFS。下面我将分别介绍这两种实现方式。 递归实现 递归实现通常更为直观和简洁。在递归方法中&#xff0c;我们会使用一…

[Java基础] 流程控制

[Java基础] 运算符 [Java基础] 基本数据类型 [Java基础] Java HashMap 的数据结构和底层原理 目录 基本语法 条件语句 if 语句 if-else 语句 switch 语句 循环语句 for 循环 while 循环 do-while 循环 跳转语句 break 语句 continue 语句 return 语句 最佳实践…

嵌入式基础 -- SDIO协议

SDIO 硬件、协议与 Linux 驱动技术文档 1. SDIO 简介 SDIO&#xff08;Secure Digital Input Output&#xff09;协议是SD存储卡的物理接口扩展&#xff0c;允许通过SD总线连接和控制各种I/O设备&#xff0c;如Wi-Fi、蓝牙、GPS模块等。SDIO协议在标准的SD协议基础上扩展&…

【题解】【记忆化递归】——Function

【题解】【记忆化递归】——Function Function题目描述输入格式输出格式输入输出样例输入 #1输出 #1 提示数据规模与约定 1.思路解析2.AC代码 Function 通往洛谷的传送门 题目描述 对于一个递归函数 w ( a , b , c ) w(a,b,c) w(a,b,c) 如果 a ≤ 0 a \le 0 a≤0 或 b ≤…

大厂面试真题-具体说说jdk1.7和1.8的hashmap的线程不安全都有什么问题

HashMap在JDK 1.7和JDK 1.8中都存在线程不安全的问题&#xff0c;但具体表现和解决方式有所不同。以下是对这两个版本中HashMap线程不安全问题的详细分析&#xff1a; JDK 1.7 HashMap的线程不安全问题 在JDK 1.7中&#xff0c;HashMap的线程不安全问题主要体现在扩容过程中。…

阿里Dataworks使用循环节点和赋值节点完成对mongodb分表数据同步

背景 需求将MongoDB数据入仓MaxCompute 环境说明 MongoDB 100个Collections&#xff1a;orders_1、orders_2、…、orders_100 前期准备 1、MongoDB数据源配置 需要先保证DW和MongoDB网络是能够联通的&#xff0c;需要现在集成任务中配置MongoDB的数据源信息。 具体可以查…

项目分析:自然语言处理(语言情感分析)

在这个信息爆炸的时代&#xff0c;我们每天都在与海量的文本数据打交道。从社交媒体上的帖子、在线评论到新闻报道&#xff0c;文本信息无处不在。然而&#xff0c;这些文本不仅仅是文字的堆砌&#xff0c;它们背后蕴含着丰富的情感和观点。如何有效地理解和分析这些情感&#…

【AI知识点】对比学习(Contrastive Learning)

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】 对比学习&#xff08;Contrastive Learning&#xff09; 是一种基于样本之间相似性和差异性的无监督或自监督学习方法&#xff0c;旨在通过构建正例和负例对来学习数据的有效表示。对比学习广泛应用于自然语言处理&#…

Linux下的防病毒软件(Antivirus software for Linux)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 本人主要分享计算机核心技…

FFmpeg的简单使用【Windows】--- 指定视频的时长

目录 功能描述 效果展示 代码实现 前端代码 后端代码 routers 》users.js routers 》 index.js app.js 功能描述 此案例是在上一个案例【FFmpeg的简单使用【Windows】--- 视频混剪添加背景音乐-CSDN博客】的基础上的进一步完善&#xff0c;可以先去看上一个案例然后再…

docker环境安装mongoDB实现平滑迁移实战

docker环境安装mongoDB实现平滑迁移实战 一、备份原始数据&#xff08;从别的服务器备份到当前服务器&#xff09;二、数据迁移三、迁移过程日志打印四、验证迁移数据准确性 一、备份原始数据&#xff08;从别的服务器备份到当前服务器&#xff09; 使用mongodump工具对原始mo…

Redisson使用全解

redisson使用全解——redisson官方文档注释&#xff08;上篇&#xff09;_redisson官网中文-CSDN博客 redisson使用全解——redisson官方文档注释&#xff08;中篇&#xff09;-CSDN博客 redisson使用全解——redisson官方文档注释&#xff08;下篇&#xff09;_redisson官网…

Java发送请求实现QPS限制

业务场景 在开发中&#xff0c;当有业务需求需要调用第三方服务实现功能&#xff0c;但是服务接口有QPS限制&#xff0c;所以我们需要在发送请求时限制发送频率防止请求失败。 实现方法 使用 Java Semaphore 类来实现控制请求QPS QPS限制 Component public class QPSControll…

洛谷P1484.种树

洛谷P1484.种树 题目解析及思路 题目要求在一条n个坑的路上&#xff0c;对于已知每个坑种树的收益&#xff0c;并且相邻两个坑不能同时种树的情况下&#xff0c;求最大收益 思考一个小范围的例子(不考虑数组全负数)&#xff1a; 当m 1时&#xff0c;答案一定为数组中的最大…

MySQL 8.4修改user的host属性值

MySQL 8.4修改user的host属性值 update mysql.user set host localhost where user mysql用户名; MySQL 8.4修改初始化后的默认密码-CSDN博客文章浏览阅读804次&#xff0c;点赞6次&#xff0c;收藏11次。先下载mysql的zip压缩包&#xff1a;MySQL :: Download MySQL Communi…

贪心day1

文章目录 前言雪糕的最大数量重新分装苹果装满石头的背包的最大数量K 次取反后最大化的数组和不同整数的最少数目 前言 &#x1f4ab;你好&#xff0c;我是辰chen&#xff0c;本文旨在准备考研复试或就业 &#x1f4ab;文章题目大多来自于 leetcode&#xff0c;当然也可能来自洛…

51、AVR、ARM、DSP等常用芯片之对比

51芯片 51芯片通常指的是基于8051内核的单片机&#xff0c;这是一种经典的微控制器&#xff08;MCU&#xff09;。虽然关于51芯片的详细现代应用和发展可能因具体型号和厂商而有所不同&#xff0c;但基于8051内核的单片机通常具有以下特点&#xff1a; 结构经典&#xff1a;8…

STL-string

STL的六大组件&#xff1a; string // string constructor #include <iostream> #include <string> using namespace std; int main() {// 构造std::string s0("Initial string");std::string s1; //nullptrstd::string s2("A character sequenc…

【在Linux世界中追寻伟大的One Piece】Jsoncpp|序列化

目录 1 -> Jsoncpp 1.1 -> 特性 1.2 -> 安装 2 -> 序列化 3 -> 反序列化 4 -> Json::Value 1 -> Jsoncpp Jsoncpp是一个用于处理JSON数据的C库。它提供了将JSON数据序列化为字符串以及从字符串反序列化为C数据结构的功能。Jsoncpp是开源的&#xf…