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

【算法专场】模拟(上)

目录

​前言

模拟算法

1576. 替换所有的问号 

495. 提莫攻击

 1688. 比赛中的配对次数

 6. Z 字形变换


前言

我们在有时候会看到刷题网站上面看到一些已经把题意讲的很明确的题目,并且一般这种不怎么需要利用那些复杂的算法,只需要我们按照着题目的意思就能够写出来,这种就是---模拟算法

模拟算法

模拟算法本质上就是比葫芦画瓢

我们只需要根据题目要求即可解答,但需要注意细节。

一般模拟的过程,我们需要在草稿纸上进行模拟,考虑某些细节问题,在模拟完之后根据演算的过程将代码一步步写出来。

接下来我们来练习一下

1576. 替换所有的问号 

通过上面的板书,那么我们就可以将演算的过程转化为以下代码:

class Solution {public String modifyString(String ss) {// 将字符串转为字符数组char[] s = ss.toCharArray();// 获取zifushuint 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);}
}

 时空复杂度为O(n),n为字符串长度。

495. 提莫攻击

将图中的演算过程转化为代码:

class Solution {public int findPoisonedDuration(int[] timeSeries, int duration) {//用来存储最终结果int ans=0;//遍历,从1开始for(int i=1;i<timeSeries.length;i++){int x=timeSeries[i]-timeSeries[i-1];if(x>=duration) ans+=duration;else ans+=x;}return ans+duration;}
}

 1688. 比赛中的配对次数

将上述转换为代码:

class Solution {public int numberOfMatches(int n) {int ans=0;while(n!=1){if(n%2==1){//奇数,比赛次数为(n-1)/2sum+=(n-1)/2;n=(n-1)/2+1;}else{//偶数,比赛次数为n/2sum+=n/2;n/=2;}}return ans;}
}

 6. Z 字形变换

将上述转换为代码:

/*** 将给定的字符串按照Z字形排列后,按行读取并返回结果字符串* Z字形排列是指字符串在numRows行中按顺序排列,第一行和最后一行除外,其它行在两端对齐* 例如,"PAYPALISHIRING"在3行中按Z字形排列后,按行读取的结果是"PAHNAPLSIIGYIR"** @param s 输入的字符串* @param numRows 字符串排列的行数* @return 按Z字形排列后按行读取的字符串*/
public String convert(String s, int numRows) {// 判断特殊情况,如果行数为1,直接返回原字符串if (numRows == 1) return s;// 创建一个字符串StringBuffer sb = new StringBuffer();// 获取输入字符串的长度int n = s.length();// 公差,用于计算每个字符在字符串中的位置增量int d = numRows * 2 - 2;// 处理第一行for (int i = 0; i < n; i += d) {sb.append(s.charAt(i));}// 处理中间行for (int k = 1; k < numRows - 1; k++) {for (int i = k, j = d - k; i < n; i += d, j += d) {sb.append(s.charAt(i));if (j < n) {sb.append(s.charAt(j));}}}// 处理最后一行for (int i = numRows - 1; i < n; i += d) {sb.append(s.charAt(i));}// 将字符串缓冲区转换为字符串并返回return sb.toString();
}

以上就是模拟上篇的全部内容咯~

若有不足,欢迎指正~ 

 


http://www.mrgr.cn/news/19131.html

相关文章:

  • C++复习day02
  • 专业文件搜索工具 | UltraSearch Pro v4.4.1.1015 绿色特别版
  • 字典树Trie(专项复习)
  • 【C++ Primer Plus习题】10.2
  • 我克隆了我自己,数字生命有什么意义?
  • 数据结构:顺序表的应用--仓库货物管理信息管理系统
  • 9.3总结
  • pikachu文件包含漏洞靶场通关攻略
  • B站视频自动驾驶master(2)
  • P01-Java何谓数组
  • 【MA35D1】buildroot 编译使用经验
  • flink窗口分组数据错乱
  • 笔记整理—uboot番外(2)find_cmd函数
  • Linux系统入门:加密与解密原理、数据安全及系统服务访问控制策略分析
  • @EnableAutoConfiguration注解使用和原理
  • glsl着色器学习(七)
  • malloc/free 和 new/delete的区别
  • 遇到bug怎么分析,这篇文章值得一看
  • Java学习|Java基础知识
  • C++11中的constexpr