算法: 模拟题目练习

文章目录

  • 模拟
    • 替换所有的问号
    • 提莫攻击
    • 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;
    }

总结

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

本文到这里就结束啦~

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大数据治理--数据生命周期管理

目录 ​编辑一、数据生命周期阶段 1.1 数据生命周期的定义 1.2 数据生命周期的主要阶段 1.2.1 创建&#xff08;Creation&#xff09; 1.2.2 存储&#xff08;Storage&#xff09; 1.2.3 使用&#xff08;Usage&#xff09; 1.2.4 归档&#xff08;Archiving&#xff09…

概率图模型中的模型推断

文章目录 摘要Abstract1. 概率图模型1.1 模型推断概念1.2 模型推断分类1.2.1 变量消去1.2.2 信念传播1.2.3 近似推断1.2.3.1 采样法1.2.3.1.1 MCMC(马尔可夫链蒙特卡罗)方法 1.2.3.2 变分推断 1.3 话题模型1.3.1 LDA的基本单元1.3.2 话题模型的构成1.3.3 LDA的基本问题1.3.3.1 …

Threejs 实现3D 地图(01)创建基本场景

"d3": "^7.9.0", "three": "^0.169.0", "vue": "^3.5.10" <script setup> import { onMounted,ref } from vue import * as THREE from three import * as d3 from "d3"; //莫开托坐标 矫正地图…

快速上手C语言【下】(非常详细!!!)

目录 1. 指针 1.1 指针是什么 1.2 指针类型 1.2.1 指针-整数 1.2.2 指针解引用 1.3 const修饰 1.4 字符指针 1.5 指针-指针 1.6 二级指针 2. 数组 2.1 定义和初始化 2.2 下标引用操作符[ ] 2.3 二维数组 2.4 终极测试 3. 函数 3.1 声明和定义 3.2 传值调用…

解锁文本数据可视化的无限可能:Wordcloud库全解析

文章目录 **&#x1f31f;解锁文本数据可视化的无限可能&#xff1a;Wordcloud库全解析&#x1f510;**1. **背景介绍**2. **Wordcloud库是什么&#xff1f;**3. **如何安装Wordcloud库&#xff1f;**4. **Wordcloud库的基本函数使用方法**5. **实际应用场景**6. **常见问题及解…

JavaScript:闭包、防抖与节流

一&#xff0c;闭包 1&#xff0c;什么是闭包 闭包是指一个函数和其周围的词法环境(lexical environment)的组合。 换句话说&#xff0c;闭包允许一个函数访问并操作函数外部的变量。 闭包的核心特性: 函数内部可以访问外部函数的变量即使外部函数已经返回&#xff0c;内部…

(AtCoder Beginner Contest 375)B - Traveling Takahashi Problem

&#xff08;AtCoder Beginner Contest 375&#xff09;B - Traveling Takahashi Problem 题目大意 按顺序给定n个点 ( x i , y i ) (x_i,y_i) (xi​,yi​) 求按顺序走过这n个点并回到原点的总距离 任意两点之间的距离是欧几里得距离 思路 按照题意模拟即可&#xff0c;时间…

Cisco软件基础使用

‘地址还未设置’在交换机的CIL中输入enable进入特权模式&#xff0c;输入config t 进入设置 设置进入特权模式的密码和登录的密码 为交换机设置IP地址 未设置地址前显示如下。 下图设置进入特权模式的密码123456 &#xff0c;远程访问登录密码cisco。 exit退一步进入interfa…

cefsharp63.0.3(Chromium 63.0.3239.132)支持H264视频播放-PDF预览 老版本回顾系列体验

一、版本 版本:Cef 63/CefSharp63.0.3/Chromium63.0.3239.132/支持H264/支持PDF预览 支持PDF预览和H264推荐版本 63/79/84/88/100/111/125 <

免费字体二次贩卖;刮刮乐模拟器;小报童 | 生活周刊 #4

Raycast 的两款在线工具 Raycast 公司出品&#xff0c;必属精品&#xff0c;之前的代码转图片工具&#xff0c;交互和颜值都做得很漂亮 现在又新出了一个 图标制作器&#xff0c;一键制作美观好看的图标 猫啃网 没想到像【汇文明朝体】这样免费的字体都被人拿来当成【打字机字…

Gin框架操作指南03:HTML渲染

官方文档地址&#xff08;中文&#xff09;&#xff1a;https://gin-gonic.com/zh-cn/docs/ 注&#xff1a;本教程采用工作区机制&#xff0c;所以一个项目下载了Gin框架&#xff0c;其余项目就无需重复下载&#xff0c;想了解的读者可阅读第一节&#xff1a;Gin操作指南&#…

2024 “源鲁杯“ Round[1] web部分

Disal 打开页面没有有用信息&#xff0c;查看robots.txt发现f1ag.php&#xff0c;访问查看源代码&#xff1a; &#xfeff;<?php show_source(__FILE__); include("flag_is_so_beautiful.php"); $a$_POST[a]; $keypreg_match(/[a-zA-Z]{6}/,$a); $b$_REQUEST[…

【2024最新版】网络安全学习路线-适合入门小白

首先说明&#xff0c;我是一名CTF的web手&#xff0c;这是我自己亲身学习网络安全的路线&#xff0c;希望能够帮到大家&#xff0c;我虽然不是大牛&#xff0c;但我也希望能够帮助一些网安小白找到自己学习的方向&#xff0c;后面有就业的详细安全技术要求&#xff0c;如果真想…

NSSCTF-WEB-easy_eval

目录 前言 正文 思路 序列化构造 后渗透 思路点1:Redis 思路2:蚁剑插件绕过disable_functinons 结尾 作者的其他文章 前言 说是easy,实际很difficult 正文 思路 <?php class A{public $code "";function __call($method,$args){//最后执行命令eval($th…

(AtCoder Beginner Contest 375)A - Seats

&#xff08;AtCoder Beginner Contest 375&#xff09;A - Seats 题目大意 给定一个长度为 N N N的字符串 S S S S S S 只包含"#“和”." 求 "#.#"子串 的出现次数 思路 签到题 O ( N ) O(N) O(N) 模拟即可 代码 #include<iostream> #includ…

ssm配置模式

新版 用Java类&#xff0c;全注解demo案例 1. AppConfig.java (Spring主配置类)package com.example.config;import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.cont…

SpringCloudAlibaba升级手册

目录 1. 版本对照 版本现状 SpringCloud与AlibabaCloud对应版本 Springboot与Elasticsearch版本对应 2. openfeign问题 问题 解决方案 3. Feign请求问题 问题 解决方法 4. Sentinel循环依赖 问题 解决方案 5. bootstrap配置文件不生效 问题 解决方案 6. Nacos的…

工信部绿色工厂、绿色设计产品、绿色供应链企业、绿色园区名单(2017-2022年)

我国工信部积极推动制造业的绿色转型&#xff0c;为了表彰在绿色制造领域取得显著成绩的企业和园区&#xff0c;发布了包括绿色工厂、绿色设计产品、绿色供应链企业、绿色园区在内的一系列公示名单。 2017年-2022年工信部绿色工厂、绿色设计产品、绿色供应链企业、绿色园区名单…

脉冲扩散模型

论文 Spiking Diffusion Models 主要内容是提出了“脉冲扩散模型&#xff08;Spiking Diffusion Models, SDMs&#xff09;”&#xff0c;一种基于脉冲神经网络&#xff08;SNN&#xff09;的生成模型&#xff0c;旨在解决传统人工神经网络&#xff08;ANN&#xff09;在图像生…

5G NR:UE初始接入信令流程浅介

UE初始接入信令流程 流程说明 用户设备&#xff08;UE&#xff09;向gNB-DU发送RRCSetupRequest消息。gNB-DU 包含 RRC 消息&#xff0c;如果 UE 被接纳&#xff0c;则在 INITIAL UL RRC MESSAGE TRANSFER 消息中包括为 UE 分配的低层配置&#xff0c;并将其传输到 gNB-CU。IN…