【算法】模拟

简介: 替换所有问号,提莫攻击,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


相关文章
【RAPHAEL】商汤发力prompt,免费开源的图文模型!我写下了湖心亭看雪与桃花源记
【RAPHAEL】商汤发力prompt,免费开源的图文模型!我写下了湖心亭看雪与桃花源记
263 0
|
JavaScript 前端开发
HTML VSCode 自用插件列表 (包含Vue)
HTML VSCode 自用插件列表 (包含Vue)
486 0
|
11月前
|
算法 搜索推荐
快速排序-数据结构与算法
快速排序(Quick Sort)是一种基于分治法的高效排序算法。其核心思想是通过选择基准(pivot),将数组划分为左右两部分,使得左侧元素均小于基准,右侧元素均大于基准,然后递归地对左右两部分进行排序。时间复杂度平均为 O(n log n),最坏情况下为 O(n²)(如数组已有序)。空间复杂度为 O(1),属于原地排序,但稳定性不佳。 实现步骤包括编写 `partition` 核心逻辑、递归调用的 `quickSort` 和辅助函数 `swap`。优化方法有随机化基准和三数取中法,以减少最坏情况的发生。
689 13
|
开发工具 Android开发 git
鸿蒙Flutter实战:01-搭建开发环境
本文介绍了如何搭建鸿蒙 Flutter 开发环境,包括安装 DevEco Studio 等工具,并详细说明了 Mac 和 Windows 系统下的环境变量配置。此外,还介绍了如何使用 FVM 管理多个 Flutter 版本,并提供了一些常见问题的解决方案和交流群信息。
634 0
鸿蒙Flutter实战:01-搭建开发环境
|
JSON 网络协议 Java
cpolar内网穿透将本地服务端接口模拟公共网络环境远程调用调试
cpolar内网穿透将本地服务端接口模拟公共网络环境远程调用调试
666 0
|
SQL 弹性计算 安全
一文教你如何从零构建机密计算平台解决方案-ECS安全季
本文整理自【弹性计算技术公开课——ECS安全季】中,阿里云弹性计算产品专家唐湘华和阿里云弹性计算高级技术专家聂百川带来的收官课程《从零构建机密计算平台的解决方案》一节。
|
存储 SQL 运维
Hologres助力AliExpress双11实时数仓升级
本篇将重点介绍Hologres在阿里巴巴AliExpress的最佳实践,并助力AliExpress实时数仓升级,节约成本近50%,提效300%。
10346 57
Hologres助力AliExpress双11实时数仓升级
|
前端开发 IDE Java
使用aop实现全局异常处理
使用aop实现全局异常处理
383 0
|
人工智能 达摩院 自然语言处理
阿里版ChatGPT「通义千问」邀请测试,我们第一时间试了试
阿里版ChatGPT「通义千问」邀请测试,我们第一时间试了试
1584 2
【数字IC手撕代码】Verilog偶数分频|题目|原理|设计|仿真(二分频,四分频,六分频,八分频,偶数分频及特殊占空比)
【数字IC手撕代码】Verilog偶数分频|题目|原理|设计|仿真(二分频,四分频,六分频,八分频,偶数分频及特殊占空比)
【数字IC手撕代码】Verilog偶数分频|题目|原理|设计|仿真(二分频,四分频,六分频,八分频,偶数分频及特殊占空比)

热门文章

最新文章