(一).算法介绍
"模拟"算法,只需要 "比着葫芦画瓢"即可
"模拟"算法的特点就是思路比较简单,主要是考察代码能力
在做"模拟"算法题的时候,一定要知道算法流程,然后把流程转化成代码
(二).具体题目
1.替换所有的问号
https://leetcode.cn/problems/replace-all-s-to-avoid-consecutive-repeating-characters/

解法:模拟

java
public String modifyString(String s) {
char[] chars = s.toCharArray();
for (int i = 0; i < chars.length; i++) {
if (chars[i]=='?'){
for (char sh ='a';sh<='z';sh++) {
if ((i==0||chars[i-1]!=sh)&&(i==chars.length-1||chars[i+1]!=sh)){
chars[i]=sh;
break;
}
}
}
}
return String.valueOf(chars);
}
2.提莫攻击

解法:模拟

java
public int findPoisonedDuration(int[] timeSeries, int duration) {
int ret=0;
for (int i = 0; i < timeSeries.length-1; i++) {
int sum=timeSeries[i+1]-timeSeries[i];
if (sum>=duration){
ret+=duration;
}else{
ret+=sum;
}
}
return ret+duration;
}
3.Z字型变换

解法:模拟

java
public String convert(String s, int numRows) {
//处理特殊情况,如果numRows=1,那么d=0,所以在处理第一行的时候就会陷入死循环
if (numRows==1){
return s;
}
StringBuilder stringBuilder=new StringBuilder();
int d=2*numRows-2; //计算公差
//处理第一行
for (int i = 0; i < s.length(); i+=d) {
stringBuilder.append(s.charAt(i));
}
//处理中间行
for (int i = 1; i < numRows-1; i++) {
for (int j = i,k=d-i; j <s.length()||k<s.length() ; j+=d,k+=d) {
if (j<s.length()){
stringBuilder.append(s.charAt(j));
}
if (k<s.length()){
stringBuilder.append(s.charAt(k));
}
}
}
//处理最后一行
for (int i = numRows-1; i < s.length(); i+=d) {
stringBuilder.append(s.charAt(i));
}
return stringBuilder.toString();
}
4.外观数列

解法:模拟

java
public String countAndSay(int n) {
String ret="1";
for (int i = 1; i <n ; i++) {
StringBuilder stringBuilder=new StringBuilder();
int left=0;
int right=0;
while (right<ret.length()){
while (right<ret.length()&&ret.charAt(left)==ret.charAt(right)){
right++;
}
stringBuilder.append(String.valueOf(right-left));
stringBuilder.append(ret.charAt(left));
left=right;
}
ret=stringBuilder.toString();
}
return ret;
}
5.数青蛙

解法:模拟

java
public int minNumberOfFrogs(String croakOfFrogs) {
char[] chars = croakOfFrogs.toCharArray();
String str="croak";
int len=str.length();
// 核心数组:hash[0]~hash[4] 分别记录 叫c、r、o、a、k 的青蛙数量
int[] hash=new int[len];
// 哈希表:建立 字符 → 对应下标 的映射(c=0, r=1, o=2, a=3, k=4)
HashMap<Character,Integer> hashMap=new HashMap<>(); //[str中的字符,字符的下标]
for (int i = 0; i < len; i++) {
hashMap.put(str.charAt(i),i);
}
for (char ch:chars) {
if (ch=='c'){ //判断是否为'c'的情况
if (hash[len-1]!=0){
hash[len-1]--;
}
hash[0]++;
}else{
int index=hashMap.get(ch);
if (hash[index-1]==0){
return -1;
}
hash[index-1]--;
hash[index]++;
}
}
// 遍历结束后检查:c/r/o/a 阶段必须没有青蛙(所有青蛙都叫完了k)
for (int i = 0; i < len-1; i++) {
if (hash[i]!=0){
return -1;
}
}
return hash[len-1];
}