【算法】模拟

简介: 替换所有问号,提莫攻击,z字形变换,外观数列,数青蛙

  image.gif 编辑

阿华代码,不是逆风,就是我疯

你们的点赞收藏是我前进最大的动力!!

希望本文内容能够帮助到你!!

目录

一:替换所有的问号

二:提莫攻击

三:z字形变换

四:外观数列

五:数青蛙

方法一

方法二


一:替换所有的问号

1576. 替换所有的问号 - 力扣(LeetCode)

image.gif 编辑

方法一

class Solution {
    public String modifyString(String ss) {
        char[] s = ss.toCharArray();
        int len = s.length;
        for(int i = 0 ; i < s.length ; i++){
            if(s[i] == '?'){
                for(char ch = 'a' ; ch <= 'z' ; ch++){
                    if( (i == 0 || ch != s[i-1]) && (i == len-1 || ch != s[i+1]) ){
                        s[i] = ch;
                        break;
                    }
                }
            }
        }
        String ret = String.valueOf(s);
        return ret;
    }
}

image.gif

方法二(复杂)

class Solution {
    public String modifyString(String s) {
        char[] tem = new char[]{'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
        char[] str = s.toCharArray();
        for(int i = 0 ; i < str.length ; i++){
            while(str[i] == '?'){
                for(int j = 0 ; j < tem.length ; j++){
                    if(i == 0){
                        if((str.length > 1) && (str[i+1] != tem[j])){
                            str[i] = tem[j];
                            break;
                        }else if(str.length == 1){
                            str[i] = tem[j];
                            break;
                        }else{
                        }
                    }else if(i == str.length-1){
                        if(str[i-1] != tem[j]){
                            str[i] = tem[j];
                        }else{
                        }
                    }else{
                        if((str[i+1] != tem[j]) && (str[i-1] != tem[j])){
                            str[i] = tem[j];
                            break;
                        }else{
                        }
                    }
                }
            }
        }
        String ret = "";
        for(int i = 0 ; i < str.length ; i++){
            ret += str[i];
        }
        return ret;
    }
}

image.gif

二:提莫攻击

495. 提莫攻击

image.gif 编辑

image.gif 编辑

class Solution {
    public int findPoisonedDuration(int[] nums, int time) {
        int sum = 0;
        for(int i = 0 ; i < nums.length-1 ; i++){
            if(nums[i+1] - nums[i] >= time){
                sum += time; 
            }else{
                sum += nums[i+1]-nums[i];
            }
        }
        sum += time;
        return sum;
    }
}

image.gif

三:z字形变换

6. Z 字形变换

image.gif 编辑

image.gif 编辑

image.gif 编辑

class Solution {
    public String convert(String s, int numRows) {
        //处理一下特殊情况
        if(numRows == 1){
            return s;
        }
        //1:创建一个变量来接收拼接的字符串
        int d = 2 * numRows - 2;
        StringBuilder ret = new StringBuilder();
        int len = s.length();
        //2:确定第一行的下标,并按照下标找到该字符,拼接上去
        for(int i = 0 ; i < len ; i += d){
            ret.append(s.charAt(i));
        }
        //3:确定中间的行数,两层循环,一行一行处理,需要两个指针用于确定坐标,然后拼接
        for(int i = 1 ; i < numRows-1 ; i++){
            for(int k = i , j = d - k ; k < len || j < len ; k += d , j += d){
                if(k < len){
                    ret.append(s.charAt(k));
                }
                if(j < len){
                    ret.append(s.charAt(j));
                }
            }
        }
        //4:确定好最后一行,同第一行处理方式一样
        for(int i = numRows-1 ; i < len ; i += d){
            ret.append(s.charAt(i));
        }
        return ret.toString();
    }
}

image.gif

四:外观数列

38. 外观数列

image.gif 编辑

image.gif 编辑

class Solution {
    public String countAndSay(int n) {
        String ret = "1";
        
        //1:下面的循环用于依次解释ret,只用解释n-1次
        for(int i = 1 ; i <= n-1 ; i++){
            //每一次都是一个新的StringBuilder
            StringBuilder temp = new StringBuilder();
            //模拟:第一次解释,对应的是n=2
            int len = ret.length();
            for(int left = 0 , right = 0 ; right < len ; ){
                //2:模拟有几个相同的数
                while(right < len && ret.charAt(left) == ret.charAt(right)){
                    right++;
                }
                temp.append(Integer.toString(right-left));
                temp.append(ret.charAt(left));
                left = right;
            }
            //更新ret,StringBuilder转换为String类型
            ret = temp.toString();
        }
        return ret;
    }
}

image.gif

五:数青蛙

1419. 数青蛙

image.gif 编辑

image.gif 编辑

方法一

class Solution {
    public int minNumberOfFrogs(String croakOfFrogs) {
        char[] str = croakOfFrogs.toCharArray();
        String t = "croak";
        int n = t.length();
        int[] hash = new int[n];
        Map<Character,Integer> hashMap = new HashMap<>();//<字符,字符对应下标>
        for(int i = 0 ; i < n ; i++){
            hashMap.put(t.charAt(i),i);
        }
        for(char ch : str){
            if(ch == t.charAt(0)){
                if(hash[n-1] != 0){
                    hash[n-1]--;
                    hash[0]++;
                }else{
                    hash[0]++;
                }
            }else{
                int i = hashMap.get(ch);
                if(hash[i-1] == 0){
                    return -1;
                }else{
                    hash[i-1]--;
                    hash[i]++;
                }
            }
        }
        for(int i = 0 ; i < n-1 ; i++){
            if(hash[i] != 0){
                return -1;
            }
        }
        return hash[n-1];
    }
}

image.gif

方法二

class Solution5 {
    public int minNumberOfFrogs(String croakOfFrogs) {
        //创建hash表,创建字符数组,遍历数组
        Map<Character,Integer> hash = new HashMap<>();
        char[] str = croakOfFrogs.toCharArray();
        hash.put('c',0);hash.put('r',0);hash.put('o',0);hash.put('a',0);hash.put('k',0);
        for(int i = 0 ; i < str.length ; i++){
            if(str[i] == 'c'){
                if(hash.get('k') == 0){
                    hash.put('c',hash.get('c')+1);
                }else{
                    hash.put('c',hash.get('c')+1);
                    hash.put('k',hash.get('k')-1);
                }
            }else{
                if(str[i] == 'r'){
                    if(hash.get('c') != 0){
                        hash.put('c',hash.get('c')-1);
                        hash.put('r',hash.get('r')+1);
                    }else{
                        return -1;
                    }
                }else if(str[i] == 'o'){
                    if(hash.get('r') != 0){
                        hash.put('r',hash.get('r')-1);
                        hash.put('o',hash.get('o')+1);
                    }else{
                        return -1;
                    }
                }else if(str[i] == 'a'){
                    if(hash.get('o') != 0){
                        hash.put('o',hash.get('o')-1);
                        hash.put('a',hash.get('a')+1);
                    }else{
                        return -1;
                    }
                }else if(str[i] == 'k'){
                    if(hash.get('a') != 0){
                        hash.put('a',hash.get('a')-1);
                        hash.put('k',hash.get('k')+1);
                    }else{
                        return -1;
                    }
                }else{}
            }
        }
        if(hash.get('c') != 0 || hash.get('r') != 0 ||
                hash.get('o') != 0 || hash.get('a') != 0 ){
            return -1;
        }
        int ret = hash.get('k');
        return ret;
        //判断
    }
}

image.gif


相关文章
|
7月前
模拟队列训练
模拟队列训练
37 0
|
28天前
|
前端开发 JavaScript
模拟 new 的实现
模拟 `new` 实现是指在 JavaScript 中,通过自定义函数来模拟内置的 `new` 操作符的行为,以便更好地理解其工作原理和对象构造过程。这种方式通常涉及创建一个新对象、绑定原型链、执行构造函数等步骤。
|
7月前
|
存储 算法
算法思想总结:模拟算法
算法思想总结:模拟算法
|
7月前
|
容灾 关系型数据库 测试技术
预测与模拟
预测与模拟
58 3
|
7月前
|
算法 Java 测试技术
【算法系列篇】模拟算法-1
【算法系列篇】模拟算法(-1
|
SQL 监控 前端开发
模拟数据在实际场景中的应用
模拟数据在实际场景中的应用
179 0
模拟数据在实际场景中的应用
|
机器学习/深度学习 传感器 算法
Gillespie 随机模拟算法附matlab代码
Gillespie 随机模拟算法附matlab代码
|
测试技术 开发工具 git
推荐一个不错的弱网模拟框架
在《APP网络性能测试白皮书》中我们已经探讨了为什么要做弱网测试以及弱网测试中需要关注的一些指标,在《弱网环境搭建方案选型》这篇文章中我们讨论了各种弱网模拟方案的优缺点,其中在预算有限的情况下我是比较推荐基于ATC和树莓派去搭建弱网模拟平台的,这块的内容可以参考《树莓派搭建弱网测试环境全纪录(1)》和《树莓派搭建弱网测试环境全纪录(2)》,基于ATC的方案其实已经可以满足绝大部分场景的需求,但是原生的ATC方案易用性比较差,每次修改网络场景需要把被测APP置于后台,切换到网络模拟界面改参数,然后再切回被测APP,影响被测APP的操作连贯性,今天我要推荐的是一个基于ATC改造后的弱网模拟工具
518 0
推荐一个不错的弱网模拟框架
|
Go
UCF2016-g2g c u l8r(模拟)
UCF2016-g2g c u l8r(模拟)
86 0