【Java 优选算法】模拟

embedded/2025/2/27 12:41:02/

欢迎关注个人主页:逸狼


创造不易,可以点点赞吗~

如有错误,欢迎指出~



模拟算法的思路比较简单,根据题目描述列出流程,找出规律,将流程转化为代码 

替换所有的问号

题目链接

解法

直接根据题目给出条件模拟 示例,找出规律

 1.先找出字符?,再让满足条件的字符ch替换 字符?,该条件为(字符? != 前一个字符) 并且 (字符? != 后一个字符) ,

在代码中就是(s[i - 1] != ch) && ( s[i + 1] != ch)

2.处理边界情况 : 当字符? 处在0下标处时,因为没有前一个字符,所以可以直接满足第一个条件

同理当字符? 处在n-1下标处时,因为没有后一个字符,所以可以直接满足第二个条件

在代码中就是(i == 0 || s[i - 1] != ch) && (i == n - 1 || s[i + 1] != ch)

画图举例

代码

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 || s[i - 1] != ch) && (i == n - 1 || s[i + 1] != ch)) {s[i] = ch;break;}}}}return String.valueOf(s);}
}

提莫攻击

题目链接

解法

找出规律 当时间间隔x>=d时,结果ret+d,当x<d时,ret+x

画图举例

代码

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;//最后一次攻击,加上完整的中毒时间}
}

N字形变换

题目链接

解法

解法1: 利用数组模拟过程,按顺序一个个填入数组,再按要求输出

解法2: 在解法1的基础上找规律,将要输出的字符串分为3段, 在第一行中,  找到第一个字符和第二个字符的公差d = 2n - 2

  • 第一段: 第一行;第一个放在0下标位置,第二个0+d,依次类推
  • 第二段:中间的k行;以每两个为一组,第一组分别是k和d-k,后面依次+d
  • 第三段:最后一行;第一个是n-1位置,后面依次+d

注意边界情况 当n =1 时,直接输出原字符串

规律如下图

代码

class Solution {public String convert(String s, int numRows) {// 处理边界情况numRows=1if (numRows == 1)return s;int d = 2 * numRows - 2, n = s.length();StringBuilder ret = new StringBuilder();// 处理第一行for (int i = 0; i < n; i += d) {ret.append(s.charAt(i));}// 处理中间k行for (int k = 1; k < numRows - 1; k++) {//依次枚举中间行for (int i = k, j = d - k; 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();}
}

外观数列

题目链接

解法

模拟+ 双指针

举例如下图数组nums, 定义left=0,right=0,

  1. 当nums[left]==nums[right]时,right向后移动,直到不相等,
  2. 此时先拼接3的次数即right - left次,
  3. 再拼接该字符,依次类推

代码

class Solution {public String countAndSay(int n) {String ret = "1";for(int i = 1; i < n; i++){//从第一行开始,描述n-1次即可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;}
}

数青蛙

题目链接

解法

借用hash表用来时刻记录每个字符的出现情况

例如字符串crcoakroakcroak,从前往后扫描,以下为模拟过程

  1. 0位置字符为c,操作为c个数+1 ,
  2. 1位置字符为r,需要确认前面的字符是否有字符c,操作即为c个数-1,r个数+1
  3. 2位置字符为c,此时操作为c个数+1
  4. 重复以上操作,直到k的数为2(代表此时有两只青蛙)
  5. 最后一声croak可以叫前面2只的其中一只重复叫的(因为题目要求返回最少青蛙数), 此时操作 k - 1
  6. 当扫描到第三个k时, k+1, 最终返回 2

代码

class Solution {public int minNumberOfFrogs(String croakOfFrogs) {char[] c =croakOfFrogs.toCharArray();String t = "croak";int n = t.length();int[] hash = new int[n];//数组模拟哈希表Map<Character, Integer> index = new HashMap<>();//<x,x字符对应的下标>for(int i = 0; i < n; i++){index.put(t.charAt(i), i);}for(char ch : c){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.ppmy.cn/embedded/167529.html

相关文章

Docker数据卷操作实战

什么是数据卷 数据卷 是一个可供一个或多个容器使用的特殊目录&#xff0c;它绕过 UFS&#xff0c;可以提供很多有用的特性: 数据卷 可以在容器之间共享和享用对 数据卷 的修改立马生效对 数据卷 的更新&#xff0c;不会影响镜像数据卷 默认会一直存在&#xff0c;即时容器被…

大白话JavaScript闭包在实际项目中有哪些应用场景?

大白话JavaScript闭包在实际项目中有哪些应用场景&#xff1f; 闭包是指有权访问另一个函数作用域中的变量的函数。在实际项目中&#xff0c;闭包有很多应用场景&#xff0c;以下是一些常见的例子&#xff1a; 数据封装和隐私保护 场景&#xff1a;在开发中&#xff0c;有时…

CSS 真的会阻塞文档解析吗?

在网页开发领域&#xff0c;一个常见的疑问是 CSS 是否会阻塞文档解析。理解这一问题对于优化网页性能、提升用户体验至关重要。要深入解答这个问题&#xff0c;需要从浏览器渲染网页的原理说起。 浏览器渲染网页的基本流程 浏览器在接收到 HTML 文档后&#xff0c;会依次进行…

单线服务器和双线服务器分别是指什么?

服务器双线和单线通常是指服务器的网络连接方式&#xff0c;单线服务器是指只有一条物理线路连接到服务器的服务器&#xff0c;成本上较为低廉&#xff0c;更加便于用户和企业进行管理与维护&#xff0c;适合对网络延迟度要求不高的小型网站和低流量的应用&#xff0c;但是当服…

苹果折叠屏iPhone突破折痕难题 或将在2026年发布

&#xff08;2025年2月26日&#xff09;据供应链最新消息&#xff0c;苹果联合三星与美国安费诺公司&#xff0c;在折叠屏核心技术上取得重大突破&#xff0c;首款折叠屏iPhone样品已接近理想水平&#xff0c;最快将于2026年底上市。 屏幕采用三星供应的内折OLED柔性屏&#x…

Gtest 框架缺点

gtest&#xff08;Google Test&#xff09;是 Google 开发的 C 单元测试框架&#xff0c;广泛应用于 C 项目的测试中。尽管它功能强大且灵活&#xff0c;但也存在一些缺点和局限性。以下是 gtest 的主要缺点&#xff1a; 1. 配置和集成复杂 问题&#xff1a;gtest 的配置和集成…

单片机病房呼叫系统设计

摘要&#xff1a;一般来说&#xff0c;病房呼叫系统是方便于病人患者与医护人员灵活沟通的一种呼叫系统&#xff0c;是解决医护人员与病人患者之间信息反馈的一种手段。病床呼叫系统的好坏直接关系到病人患者的生命安危&#xff0c;像今年的新冠型肺炎&#xff0c;没有一个灵活…

Vue 项目中配置代理的必要性与实现指南

Vue 项目中配置代理的必要性与实现指南 在 Vue 前端项目的开发过程中&#xff0c;前端与后端地址通常不同&#xff0c;可能引发跨域问题。为了在开发环境下顺畅地请求后端接口&#xff0c;常常会通过配置**代理&#xff08;proxy&#xff09;**来解决问题。这篇文章将详细解析…