算法: 模拟题目练习

news2024/10/21 11:43:27

文章目录

  • 模拟
    • 替换所有的问号
    • 提莫攻击
    • Z 字形变换
    • 外观数列
    • 数青蛙
  • 总结


模拟

替换所有的问号

在这里插入图片描述
按照题目的要求写代码即可~

    public String modifyString(String ss) {
        int n = ss.length();
        if (n == 1) {
            return "a";
        }
        char[] s = ss.toCharArray();
        for (int i = 0; i < n; i++) {
            if (s[i] == '?') {
                for (char ch = 'a'; ch <= 'z'; ch++) {
                    if (i == 0 && ch != s[i + 1]) {
                        // 第一个
                        s[i] = ch;
                    } else if (i == n - 1 && ch != s[i - 1]) {
                        // 最后一个
                        s[i] = ch;
                    }
                    if (0 < i && i < n - 1 && ch != s[i + 1] && ch != s[i - 1]) {
                        // 中间
                        s[i] = ch;
                    }
                }
            }
        }
        return String.valueOf(s);
    }

题解写的更加简洁.

题解代码:

    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);
    }

提莫攻击

在这里插入图片描述
草稿:
在这里插入图片描述

    public int findPoisonedDuration(int[] timeSeries, int duration) {
        int tmp = timeSeries[0] + duration - 1;
        int sum = duration;
        for (int i = 1; i < timeSeries.length; i++) {
            if (tmp >= timeSeries[i]) {
                sum += timeSeries[i] - timeSeries[i - 1];
            } else {
                sum += duration;
            }
            tmp = timeSeries[i] + duration - 1;
        }
        return sum;
    }

题解代码:
草图:
在这里插入图片描述

    public int findPoisonedDuration(int[] timeSeries, int duration) {
        int sum = 0;
        for (int i = 1; i < timeSeries.length; i++) {
            int tmp = timeSeries[i] - timeSeries[i - 1];
            if (tmp > duration) {
                sum += duration;
            } else {
                sum += tmp;
            }
        }
        return sum + duration;
    }

Z 字形变换

在这里插入图片描述
虽然过了,但是稀里糊涂地过了~

开头和结尾都好说,主要是中间,不知道为啥要 - 2*i.

规律就是这样的~

做题思路就是:

  • 题目让干啥,我们就干啥
  • 画图找规律~

坑:

  • numRows 可能为 1 .
  • 放中间元素时,容易越界.

代码:

public String convert(String ss, int numRows) {
        if (numRows == 1)
            return ss;
        char[] s = ss.toCharArray();
        int n = s.length;
        char[] ret = new char[n];

        int gap = (numRows - 1) * 2;
        int k = 0;
        // 开头
        for (int j = 0; j < n; j += gap) {
            ret[k++] = s[j];
        }

        // 中间
        for (int i = 1; i <= numRows - 2; i++) {
            for (int j = i; j < n; j += gap) {
                ret[k++] = s[j];
                // 这里为啥 - i*2 就对了?
                int mid = j + gap - i * 2;
                if (mid < n) {
                    ret[k++] = s[mid];
                }
            }
        }

        // 结尾
        for (int j = numRows - 1; j < n; j += gap) {
            ret[k++] = s[j];
        }

        return String.valueOf(ret);
    }

外观数列

在这里插入图片描述

终于过了~
不知道为啥,自己写的代码返回的结果一直只有两个数. 在这上面耗了20多分钟.
最后全删了.心态崩了呀.
吃完饭回来,重写了一遍,只用了不到6分钟就写出来了.

坑:

  • 不用考虑怎么替换的问题,最开始我也被题目带偏了.如果用替换来写,需要考虑的情况就复杂了. 其实直接新建一个字符串,不断向这个字符串后面拼接就行了.
    public String countAndSay(int n) {
        StringBuilder ret = new StringBuilder("1");
        for (int i = 1; i < n; i++) {
            StringBuilder tmp = new StringBuilder();
            int len = ret.length();
            int left = 0, right = 0;
            while (right < len) {
                while (right < len && ret.charAt(left) == ret.charAt(right)) {
                    right++;
                }
                tmp.append(right - left);
                tmp.append(ret.charAt(left));
                left = right;
            }
            ret = tmp;
        }
        return ret.toString();
    }

数青蛙

在这里插入图片描述

最后一个测试用例卡了好久.

坑:

  • 如何判断给出的字符串不是 “croak” 的有效组合? 可以用最后的 sum 来判断,如果 sum 没有减到0,那就说明字符串不完整.
    public int minNumberOfFrogs(String croakOfFrogs) {
        if (croakOfFrogs.length() < 5 || croakOfFrogs.length() % 5 != 0) {
            return -1;
        }
        int sum = 0;
        int ret = 0;
        char[] str = {'c', 'r', 'o', 'a', 'k'};
        HashMap<Character, Integer> hash = new HashMap<>();
        HashMap<Character, Character> hash2 = new HashMap<>();
        for (int i = 1; i < 5; i++) {
            hash2.put(str[i], str[i - 1]);
        }
        int n = croakOfFrogs.length();
        for (int i = 0; i < n; i++) {
            char ch = croakOfFrogs.charAt(i);
            hash.put(ch, hash.getOrDefault(ch, 0) + 1);
            if (ch != 'c' && hash.getOrDefault(ch, 0) > hash.getOrDefault(hash2.get(ch), 0)) {
                return -1;
            }
            if (ch == 'c') {
                sum++;
            } else if (ch == 'k') {
                ret = Math.max(ret, sum);
                sum--;
            }
        }
        if (sum != 0) return -1;
        return ret;
    }

看了题解后又自己写了一遍:
在这里插入图片描述

    public int minNumberOfFrogs(String croakOfFrogs) {
        String str = "croak";
        HashMap<Character, Integer> hashIndex = new HashMap<>();
        for (int i = 0; i < 5; i++) {
            hashIndex.put(str.charAt(i), i);
        }
        HashMap<Character, Integer> hashCount = new HashMap<>();
        int n = croakOfFrogs.length();
        for (int i = 0; i < n; i++) {
            char ch = croakOfFrogs.charAt(i);
            if (ch != 'c') {
                // r,o,a,k
                char prev = str.charAt(hashIndex.get(ch) - 1);
                int pervCount = hashCount.getOrDefault(prev, 0);
                if (pervCount > 0) {
                    hashCount.put(prev, pervCount - 1);
                    hashCount.put(ch, hashCount.getOrDefault(ch, 0) + 1);
                } else if (pervCount <= 0) {
                    return -1;
                }
            } else {
                // c
                if (hashCount.getOrDefault('k', 0) > 0) {
                    hashCount.put('k', hashCount.get('k') - 1);
                }
                hashCount.put(ch, hashCount.getOrDefault(ch, 0) + 1);
            }
        }

        // 检验给出的字符串是不是 "croak" 的有效组合。
        for (int i = 0; i < 4; i++) {
            if (hashCount.get(str.charAt(i)) != 0) {
                return -1;
            }
        }

        return hashCount.get('k');
    }

题解代码:

  • 使用数组替代了 hash 表.
    public int minNumberOfFrogs(String c) {
        char[] croakOfFrogs = c.toCharArray();
        String str = "croak";
        int n = str.length();
        int[] hash = new int[n];
        HashMap<Character, Integer> index = new HashMap<>();
        // 建立字母和下标的关系
        for (int i = 0; i < n; i++) {
            index.put(str.charAt(i), i);
        }

        for (char ch : croakOfFrogs) {
            if (ch != 'c') {
                // r,o,a,k
                int i = index.get(ch);
                if (hash[i - 1] > 0) {
                    hash[i - 1]--;
                    hash[i]++;
                } else {
                    return -1;
                }
            } else {
                // c
                if (hash[n - 1] > 0)
                    hash[n - 1]--;
                hash[0]++;
            }
        }

        for (int i = 0; i < n - 1; i++) {
            if (hash[i] != 0) return -1;
        }

        return hash[n - 1];
    }

看题解看到了一个 if else 大法 :

public int minNumberOfFrogs(String croakOfFrogs) {
        int c,r,o,a,k;
        c = 0; r = 0; o = 0; a = 0;k = 0;
        char []chars = croakOfFrogs.toCharArray();
        int res = 0;
        for(int i = 0;i < chars.length;i++){
            if(chars[i] == 'c'){
                if(k > 0){k--;}else{res++;}
                c++;
            }else if(chars[i] == 'r'){
                c--;r++;
            }else if(chars[i] == 'o'){
                r--;o++;
            }else if(chars[i] == 'a'){
                o--;a++;
            }else if(chars[i] == 'k'){
                a--;k++;
            }
            if(c < 0 || r < 0 || o < 0 || a < 0){
                break;
            }
        }
        if(c != 0 || r != 0 || o != 0 || a != 0){
            return -1;
        }
        return res;
    }

总结

  • 做模拟题时, 题目说啥咱干啥~
  • 有难度的模拟题需要我们找规律.
  • 画图是个好东西.

本文到这里就结束啦~

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2219198.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【华为HCIP实战课程十三】OSPF网络中3类LSA及区域间负载均衡,网络工程师

一、ABR SW1查看OSPF ABR为R4而非R3,因为R4连接骨干区域0,R3没有连接到区域0 R6查看OSPF路由: 二、查看3类LSA,由于R6不是ABR因此自身不会产生3类LSA 但是有区域间路由就可以看到3类LSA

分布式介绍

CAP理论 CAP理论是分布式架构中提出来的一种设计思想模型&#xff0c;全称是由Consistency、Availability、Partition Tolerance三个词组成。 C(Consistency&#xff0c;一致性):总能读到最新的写操作的结果A(Availability&#xff0c;可用性):每个请求都要在合理的时间内给出…

Spring Boot知识管理:跨平台集成方案

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式&#xff0c;是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示&#xff1a; 图4-1系统工作原理…

后渗透利用之vcenter

目录 vcenter介绍环境搭建历史漏洞版本信息1、直接访问2、请求接⼝ 打点CVE_2021_21972漏洞描述&#xff1a;POC&#xff1a; 后渗透获取vCenter后台重置密码Cookie登录创建管理员 获取虚拟机Hash分析快照挂载磁盘 获取Esxi 后台获取解密key获取数据库账号密码查询Esxi加密密码…

ESP32-IDF 分区表

目录 一、基本介绍1、配置结构体1.1 esp_partition_t1.2 esp_partition_iterator_t 2、常用 API2.1 esp_partition_find2.2 esp_partition_find_first2.3 esp_partition_get2.4 esp_partition_next2.5 esp_partition_iterator_release2.6 esp_partition_verify2.7 esp_partitio…

使用WPF写一个简单的开关控件

<Window x:Class"WPF练习.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d"http://schemas.microsoft.com/expression/blend/2008"xm…

适用于 vue react Es6 jQuery 等等的组织架构图(组织结构图)

我这里找的是 OrgChart 插件; 地址: GitHub - dabeng/OrgChart: Its a simple and direct organization chart plugin. Anytime you want a tree-like chart, you can turn to OrgChart. 这里面能满足你对组织架构图的一切需求! ! ! 例: 按需加载 / 拖拽 / 编辑 / 自定义 / …

【玉米病害识别】Python+卷积神经网络算法+人工智能+深度学习+计算机课设项目+TensorFlow+模型训练

一、介绍 玉米病害识别系统&#xff0c;本系统使用Python作为主要开发语言&#xff0c;通过收集了8种常见的玉米叶部病害图片数据集&#xff08;‘矮花叶病’, ‘健康’, ‘灰斑病一般’, ‘灰斑病严重’, ‘锈病一般’, ‘锈病严重’, ‘叶斑病一般’, ‘叶斑病严重’&#x…

使用JMeter进行Spring Boot接口的压力测试

使用 Apache JMeter 对接口进行压力测试是一个相对简单的过程。以下是详细的步骤&#xff0c;包括安装、配置和执行测试计划。 1. 下载和安装 JMeter 下载 JMeter 从 JMeter 官方网站https://jmeter.apache.org/download_jmeter.cgi 下载最新版本的 JMeter。 解压缩 将下载的 …

【AIGC】ChatGPT与人类理解力的共鸣:人机交互中的心智理论(ToM)探索

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 &#x1f4af;前言&#x1f4af;心智理论(Theory of Mind,ToM)心智理论在心理学与神经科学中的重要性心智理论对理解同理心、道德判断和社交技能的重要性结论 &#x1f4af;乌得勒支大学研究对ChatGPT-4…

基于python+dj+mysql的音乐推荐系统网页设计

音乐网站开发 如果你在学Python&#xff0c;需相关的【配套资料工具】作为研究[doge][脱单doge] 可以后台✉私信up主&#xff0c;发送&#x1f449;关键词【音乐】 本章以音乐网站项目为例&#xff0c;介绍Django在实际项目开发中的应用&#xff0c;该网站共分为6个功能模块分…

使用开源的 Vue 移动端表单设计器创建表单

FcDesigner Vant 版是一款基于 Vue3.0 的移动端低代码可视化表单设计器工具&#xff0c;通过数据驱动表单渲染。可以通过拖拽的方式快速创建表单&#xff0c;提高开发者对表单的开发效率&#xff0c;节省开发者的时间。 源码下载 | 演示地址 | 帮助文档 本项目采用 Vue3.0 和 …

Elasticsearch基本使用及介绍

Elasticsearch 1. 关于各种数据库的使用 关于MySQL&#xff1a;是关系型数据库&#xff0c;能清楚的表示数据之间的关系&#xff0c;并且&#xff0c;是基于磁盘存储的&#xff0c;可以使用相对较低的成本存储大量的数据 关于Redis&#xff1a;是基于K-V结构的在内存中读写数…

屏蔽小米电视广告的方法

小米电视那个广告&#xff0c;太多&#xff0c;时间太长&#xff0c;影响观看感受&#xff0c;经过处理&#xff0c;成功屏蔽了小米电视的广告&#xff0c;提升了观影体验。 手动添加AD域名到 hosts 列表 小米(红米)电视关闭开机AD屏蔽hosts方法。 在路由器的hosts中配置。 …

信息安全工程师(58)网络安全漏洞处置技术与应用

前言 网络安全漏洞处置技术与应用是一个复杂而关键的领域&#xff0c;它涉及漏洞的发现、评估、修补以及后续的监控与防范等多个环节。 一、网络安全漏洞发现技术 网络安全漏洞发现技术是漏洞处置的首要步骤&#xff0c;它旨在通过各种手段识别出网络系统中存在的潜在漏洞。这些…

Unity开发Hololens项目

Unity打包Hololens设备 目录Visual Studio2019 / Visual Studio2022 远端部署设置Visual Studio2019 / Visual Studio2022 USB部署设置Hololens设备如何查找自身IPHololens设备门户Unity工程内的打包设置 目录 记录下自己做MR相关&#xff1a;Unity和HoloLens设备的历程。 Vi…

Vue学习笔记 Class绑定 Style绑定 侦听器 表单输入绑定 模板引用 组件组成 组件嵌套关系

文章目录 Class绑定绑定对象绑定数组注意事项 style绑定绑定对象代码效果展示 绑定数组 侦听器注意的点代码效果 表单输入绑定示例代码效果展示 修饰符.lazy.number.trim 模板引用组件组成组件组成结构引入组件步骤style中的scoped作用 组件嵌套关系 Class绑定 绑定对象 绑定数…

论文精读:PRL 交变磁MnTe中的手性分裂磁振子

DOI: 10.1103/PhysRevLett.133.156702 摘要节选 与电子带的自旋分裂一样&#xff0c;预测交变磁体中的磁振子带也表现出交替的手性分裂。本文通过对α-MnTe进行非弹性中子散射&#xff08;INS&#xff09;&#xff0c;直接观察到α-MnTe的磁振子分裂现象。磁振子的简并解除可以…

【计算机网络 - 基础问题】每日 3 题(四十七)

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?typeblog &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞…

硬盘格式化后能恢复数据吗?4款好用的数据恢复软件,格式化后也能安心

咱们今天来谈谈一个挺烦人的问题——硬盘格式化后能恢复数据吗&#xff1f;别担心&#xff0c;能的&#xff01;只要你用对方法&#xff0c;就算硬盘被清空了&#xff0c;那些重要文件还是能找回来的。下面&#xff0c;我就给你们介绍几款超给力的数据恢复软件&#xff0c;让你…