当前位置: 首页 > news >正文

Java模拟算法题目练习

模拟算法

  • 替换所有的问好
  • 提莫攻击
  • Z字形变换
  • 外观数列
  • 数青蛙

模拟算法就是根据其题目进行一步一步操作即可,相对而言较简单,但是边界情况要处理好(细节问题)

替换所有的问好

在这里插入图片描述

题目解析:将s字符串中的?全部替换成小写字母,并且替换?的字符不可以与原本?相邻的两个字符相等
模拟:只需要根据题目条件,找出所有?,并将其替换成符合要求的小写字母即可

在这里插入图片描述

class Solution {public String modifyString(String ss) {//替换问好,但是相邻的不可以重复int n = ss.length();char[] s = ss.toCharArray();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);}
}

时间复杂度:O(n)
空间复杂度:O(n)

提莫攻击

在这里插入图片描述

题目解析:提莫会对艾希释放技能,让艾希处于中毒状态,求出中毒的总时间
模拟:会出现一次技能持续时间还没有结束,又释放了一个技能
因此我们要判断相邻两次释放技能时间差值与技能持续时间进行对比
如果差值大于或者等于技能持续时间,总时间就加上duration
反之,总时间就加上差值
但是这加上的都是上一次技能的持续时间,因此最后要加上duration,因为最后一次技能肯定会执行完

在这里插入图片描述

class Solution {public int findPoisonedDuration(int[] timeSeries, int duration) {//判断这次攻击与上次攻击的时间差值即可//差值 >= duration,上一次执行时间为duration//反之 < duration, 上一次执行的时间就是差值int sum  = 0;for(int i = 1;i < timeSeries.length;i++){int x = timeSeries[i] - timeSeries[i - 1];if(x >= duration){sum += duration;}else{sum += x;}}//加上最后一次技能的持续时间return sum + duration;}
}

时间复杂度:O(n)
空间复杂度:O(1)

Z字形变换

在这里插入图片描述

题目解析:给一个字符串,输出其Z字形转换后,按行放入一个新的字符串中返回
模拟:可以直接将其全部字符按照Z字形放到二维矩阵中,并遍历即可,但是时间复杂度和空间复杂度较高,因此我们看看可以找规律吗

在这里插入图片描述

在这里插入图片描述

此时要注意当n = 1时候,其可能会死循环,因此要判断一下

class Solution {public String convert(String s, int numRows) {if(numRows < 2){return s;}int n = s.length();//公差int d = 2*numRows - 2;StringBuffer ret = new StringBuffer();//第一行for(int i = 0;i < n;i += d){ret.append(s.charAt(i));}//中间行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));}}}for(int i = numRows-1;i < n;i += d){ret.append(s.charAt(i));}return ret.toString();}
}

时间复杂度:O(n)
空间复杂度:O(n)

外观数列

在这里插入图片描述

题目解析:就是有很多行的字符串,每一行字符串都是解释的上一行字符串,找出第n行字符串
模拟+双指针

在这里插入图片描述

class Solution {public String countAndSay(int n) {//一直解释,解释到第n行String ret = "1";for(int i = 1 ; i < n;i++){//存放当前这一行的解释StringBuilder tem = new StringBuilder();//当前行的长度int len = ret.length();//开始解释for(int left = 0,right = 0;right < len;){while(right < len&&ret.charAt(left) == ret.charAt(right)){right++;//直到不相同为止}tem.append(Integer.toString(right - left));tem.append(ret.charAt(left));left = right;}ret = tem.toString();}return ret;}
}

数青蛙

在这里插入图片描述

题目解析:给了一个字符串,求最小青蛙数量,这里完整的croak才是哇叫,如果存在不完整的就返回-1
模拟+哈希表
因此每次遍历到那个字符都要判断其前驱字符是否存在
使用一个数组放croak对应元素个数
因为这里要找前驱,所以一个哈希表,存放croak这些字符对应下标关系,这样可以对应到上面数组中个数

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

可以直接使用5个变量记录这个字符出现的个数,不断if else即可

class Solution {public int minNumberOfFrogs(String croakOfFrogs) {if(croakOfFrogs.length()%5!=0){return -1;}int c = 0;int r = 0;int o = 0;int a = 0;int k = 0;int ret = 0;for (int i = 0; i < croakOfFrogs.length(); i++) {char ch = croakOfFrogs.charAt(i);//每次都哟啊判断其前驱字符个数if (ch == 'c') {//判断又没有青蛙叫完,有的话就可以从后面直接调取即可if(k > 0){--k;++c;}else{++c;}} else if (ch == 'r') {if (c == 0) {return -1;} else {--c;++r;}} else if (ch == 'o') {if (r == 0) {return -1;} else {--r;++o;}} else if (ch == 'a') {if (o == 0) {return -1;} else {--o;++a;}} else {if (a == 0) {return -1;} else {--a;++k;}}}if(c!=0||r!=0||o!=0||a!=0){return -1;}return k;}
}

使用数组存放对应数量,哈希表来对应下标关系

class Solution {public int minNumberOfFrogs(String croakOfFrogs) {//使用数组模拟哈希String t = "croak";int n = t.length();int[] hash = new int[n];//存放对应元素个数//使用哈希表来映射他们的下标Map<Character,Integer> map = new HashMap<>();//先放入哈希中for(int i = 0;i < n;i++){map.put(t.charAt(i),i);}//此时就要开始判断for(char ch : croakOfFrogs.toCharArray()){//如果是c字符要进行判断,k是否存在if(ch == t.charAt(0)){if(hash[n-1] != 0){hash[n-1]--;}hash[0]++;}else{//中间字符//因为要判断前驱字符,这里要获取下标int index = map.get(ch);if(hash[index - 1] == 0){return -1;}else{hash[index-1]--;hash[index]++;}}}//最后要判断其除了k字符,前面字符是否还有for(int i = 0;i < n-1;i++){if(hash[i] != 0){return  -1;}}return hash[n-1];}
}
http://www.dtcms.com/a/605020.html

相关文章:

  • Mac远程控制新篇章:UU远程被控端深度测评
  • WordPress插件--菜单登录后可见的插件
  • 电商数据分析报告
  • Rust与主流编程语言客观对比:特性、场景与实践差异
  • C语言编译器有哪些 | 选择最适合的编译器提高开发效率
  • 网站频道规划网站个人备案模版
  • 昆明公司建设网站制作上海seo外包
  • MySQL: 存储引擎选择策略:基于事务支持、备份需求、崩溃恢复及特性兼容性的综合指南
  • 学生成绩管理系统 基于java+springboot+vue实现前后端分离项目并附带万字文档(源码+数据库+万字详设文档+软件包+安装教程)
  • ios-WebP
  • 网站如何做网站解析品牌策划方案怎么做
  • 能源企业合同管理数智化转型解决方案
  • 国标新规下的零碳园区新基建:碳电表与智慧能源平台的协同赋能
  • 从MCU到Agent:嵌入式系统如何进化成AI能源体
  • Hadess入门到精通 - 如何管理Docker制品
  • 网站建设对于电子商务的意义可以做代发货源的网站
  • ⸢ 拾伍 ⸥⤳ 安全数智化概念及建设思路
  • UCOS-III笔记(六)
  • 企业小型网站要多少钱百度怎么做网站广告
  • macos HbuildX 使用cli脚本创建uniapp 运行时报错“cli项目运行依赖本地的Nodejs环境,请先安装并配置到系统环境变量后重试。”
  • Android MediaCodec 硬编解码实战:从Camera预览到H264流与回环渲染
  • 大数据时代时序数据库选型指南:从技术架构到实战案例
  • STM32MP1 没有硬件编解码,如何用 CPU 实现 H.264 编码支持 WebRTC?
  • 完整事务性能瓶颈分析案例:支付系统事务雪崩优化
  • Java后端常用技术选型 |(三)分布式篇
  • el-table动态添加行,删除行
  • 房产网站制作流程搞一个网站需要多少钱
  • 怎么做仲博注册网站黄冈网站seo
  • 回顾-大语言模型分类
  • MTK平台蓝牙学习-- 如何将BLE功率调整参数对应CFG_BT_Default.h合入软件