【Java 优选算法】模拟

news2025/2/28 19:12:42

欢迎关注个人主页:逸狼


创造不易,可以点点赞吗~

如有错误,欢迎指出~



模拟算法的思路比较简单,根据题目描述列出流程,找出规律,将流程转化为代码 

替换所有的问号

题目链接

解法

直接根据题目给出条件模拟 示例,找出规律

 1.先找出字符?,再让满足条件的字符ch替换 字符?,该条件为(字符? != 前一个字符) 并且 (字符? != 后一个字符) ,

在代码中就是(s[i - 1] != ch) && ( s[i + 1] != ch)

2.处理边界情况 : 当字符? 处在0下标处时,因为没有前一个字符,所以可以直接满足第一个条件

同理当字符? 处在n-1下标处时,因为没有后一个字符,所以可以直接满足第二个条件

在代码中就是(i == 0 || s[i - 1] != ch) && (i == n - 1 || s[i + 1] != ch)

画图举例

代码

class Solution {
    public String modifyString(String ss) {
        char[] s = ss.toCharArray();
        int n = s.length;
        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);
    }
}

提莫攻击

题目链接

解法

找出规律 当时间间隔x>=d时,结果ret+d,当x<d时,ret+x

画图举例

代码

class Solution {
    public int findPoisonedDuration(int[] timeSeries, int duration) {
        int ret= 0;
        for(int i = 1; i < timeSeries.length; i++){
            int x = timeSeries[i] - timeSeries[i - 1];
            if(x >= duration){
                ret += duration;
            }else{
                ret += x;
            }
        }
        return ret + duration;//最后一次攻击,加上完整的中毒时间
    }
}

N字形变换

题目链接

解法

解法1: 利用数组模拟过程,按顺序一个个填入数组,再按要求输出

解法2: 在解法1的基础上找规律,将要输出的字符串分为3段, 在第一行中,  找到第一个字符和第二个字符的公差d = 2n - 2

  • 第一段: 第一行;第一个放在0下标位置,第二个0+d,依次类推
  • 第二段:中间的k行;以每两个为一组,第一组分别是k和d-k,后面依次+d
  • 第三段:最后一行;第一个是n-1位置,后面依次+d

注意边界情况 当n =1 时,直接输出原字符串

规律如下图

代码

class Solution {
    public String convert(String s, int numRows) {
        // 处理边界情况numRows=1
        if (numRows == 1)
            return s;

        int d = 2 * numRows - 2, n = s.length();
        StringBuilder ret = new StringBuilder();
        // 处理第一行
        for (int i = 0; i < n; i += d) {
            ret.append(s.charAt(i));
        }
        // 处理中间k行
        for (int k = 1; k < numRows - 1; k++) {//依次枚举中间行
            for (int i = k, j = d - k; i < n || j < n; i += d, j += d) {
                if (i < n)
                    ret.append(s.charAt(i));
                if (j < n)
                    ret.append(s.charAt(j));
            }
        }
        //3.处理最后一行
        for(int i = numRows - 1; i < n; i += d){
            ret.append(s.charAt(i));
        }
        return ret.toString();
    }
}

外观数列

题目链接

解法

模拟+ 双指针

举例如下图数组nums, 定义left=0,right=0,

  1. 当nums[left]==nums[right]时,right向后移动,直到不相等,
  2. 此时先拼接3的次数即right - left次,
  3. 再拼接该字符,依次类推

代码

class Solution {
    public String countAndSay(int n) {
        String ret = "1";
        for(int i = 1; i < n; i++){//从第一行开始,描述n-1次即可
            StringBuilder tmp = new StringBuilder();
            int len = ret.length();
            for(int left = 0, right = 0; right < len; ){
                while(right < len && ret.charAt(left) == ret.charAt(right)) right++;
                tmp.append(Integer.toString(right - left));//拼接被描述字符的次数
                tmp.append(ret.charAt(left));//拼接被描述的字符
                left = right;
            }
            ret = tmp.toString();
        }
        return ret;
    }
}

数青蛙

题目链接

解法

借用hash表用来时刻记录每个字符的出现情况

例如字符串crcoakroakcroak,从前往后扫描,以下为模拟过程

  1. 0位置字符为c,操作为c个数+1 ,
  2. 1位置字符为r,需要确认前面的字符是否有字符c,操作即为c个数-1,r个数+1
  3. 2位置字符为c,此时操作为c个数+1
  4. 重复以上操作,直到k的数为2(代表此时有两只青蛙)
  5. 最后一声croak可以叫前面2只的其中一只重复叫的(因为题目要求返回最少青蛙数), 此时操作 k - 1
  6. 当扫描到第三个k时, k+1, 最终返回 2

代码

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

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

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

相关文章

@RequiredArgsConstructor 和 @Autowired区别

1、注入方式 RequiredArgsContructor&#xff1a;通过构造函数的方式实现依赖注入。该注解会被final修饰&#xff0c;并将依赖对象通过构造参数进行注入。 Autowired&#xff1a;通过属性注入的方式实现依赖注入&#xff0c;将依赖对象自动注入到被该注解的字段上 2、使用场景…

【Linux网络】数据链路层 其他常见的协议

目录 1. 认识以太网 2. 以太网帧格式 3. MTU 4. ARP协议 4.1 ARP数据报的格式 4.2 ARP攻击 5. 其他重要的协议或技术 5.1 DNS协议 5.2 ICMP协议 5.3 NAT技术 5.4 代理服务器 5.5 内网穿透 总结 针对数据在网络传输中所遇到的问题&#xff0c;网络协议栈都对相应的…

Ubuntu 安装 Nginx并配置反向代理

Ubuntu版本&#xff1a;Ubuntu 24.04.2 LTS 一、安装Nginx ​更新系统软件包​ 安装前需确保系统处于最新状态&#xff0c;避免依赖冲突 sudo apt update && sudo apt upgrade -y ​安装Nginx主程序​ Ubuntu官方仓库已包含稳定版Nginx&#xff0c;直接安装即可 sudo…

赋能农业数字化转型 雏森科技助力“聚农拼”平台建设

赋能农业数字化转型&#xff0c;雏森科技助力“聚农拼”平台建设 在数字化浪潮席卷各行业的今天&#xff0c;农业领域也在积极探索转型升级之路。中农集团一直以“根植大地&#xff0c;服务三农”为核心&#xff0c;以“乡村振兴&#xff0c;农民增收”为目标&#xff0c;及时…

1. HTTP 数据请求

相关资源&#xff1a; 图片素材&#x1f4ce;图片素材.zip 接口文档 1. HTTP 数据请求 什么是HTTP数据请求&#xff1a; (鸿蒙)应用软件可以通过(鸿蒙)系统内置的 http 模块 和 Axios&#xff0c;通过 HTTP 协议和服务器进行通讯 学习核心Http请求技术: Http模块 - 属于鸿…

VSCode轻松调试运行.Net 8.0 Web API项目

1.背景 我一直都是用VS来开发.NetCore项目的&#xff0c;用的比较顺手&#xff0c;也习惯了。看其他技术文章有介绍VS Code更轻量&#xff0c;更方便。所以我专门花时间来使用VS Code&#xff0c;看看它是如何调试代码、如何运行.Net 8.0 WebAPI项目。这篇文章是一个记录的过程…

2024年国赛高教杯数学建模D题反潜航空深弹命中概率问题解题全过程文档及程序

2024年国赛高教杯数学建模 D题 反潜航空深弹命中概率问题 原题再现 应用深水炸弹&#xff08;简称深弹&#xff09;反潜&#xff0c;曾是二战时期反潜的重要手段&#xff0c;而随着现代军事技术的发展&#xff0c;鱼雷已成为现代反潜作战的主要武器。但是&#xff0c;在海峡或…

obj离线加载(vue+threejs)+apk方式浏览

demo需求&#xff1a;移动端&#xff0c;实现obj本地离线浏览 结合需求&#xff0c;利用&#xff08;vue2threejs173&#xff09;进行obj的加载&#xff0c;然后采用apk方式&#xff08;hbuilderX打包发布&#xff09;移动端浏览&#xff1b; https://github.com/bianbian886/…

关于mysql 表中字段存储JSON对象对JSON对象中的bolean字段进行查询的方式

业务场景如题 JSON对象为 表为客诉表中的 发现利用原有的xml中的 and a1.order_list ->‘$[*].isZg’ request.isZg 后续发现需要更改为有效 本文作为自己日常工作记录用&#xff0c;有遇到相同问题的可以作为参考。

Kylin麒麟操作系统 | 系统监控

以下所使用的环境为&#xff1a; 虚拟化软件&#xff1a;VMware Workstation 17 Pro 麒麟系统版本&#xff1a;Kylin-Server-V10-SP3-2403-Release-20240426-x86_64 一、系统状态查询工具 1. 静态显示系统进程信息ps ps命令会生成一个静态列表&#xff0c;列表中显示的进程其…

vLLM服务设置开机自启动(Linux)

要在开机时进入指定的 conda 环境并启动此 vllm 服务&#xff0c;您可以通过以下步骤设置一个 systemd 服务来自动执行脚本。 一、第一步&#xff1a;创建一个启动脚本 1.打开终端并创建启动脚本&#xff0c;例如 /home/username/start_vllm.sh&#xff08;请替换 username 为…

几个api

几个api 原型链 可以阅读此文 Function instanceof Object // true Object instanceof Function // true Object.prototype.isPrototypeOf(Function) // true Function.prototype.isPrototypeOf(Object) // true Object.__proto__ Function.prototype // true Function.pro…

数字IC后端设计实现OCC(On-chip Clock Controller)电路介绍及时钟树综合案例

数字IC后端时钟树综合专题&#xff08;OCC电路案例分享&#xff09; 复杂时钟设计时钟树综合(clock tree synthesis)常见20个典型案例 1、什么是OCC&#xff1f; 片上时钟控制器(On-chip Clock Controllers &#xff0c;OCC)&#xff0c;也称为扫描时钟控制器(Scan Clock Con…

Trae根据原型设计稿生成微信小程序密码输入框的踩坑记录

一、需求描述 最近经常使用Trae生成一些小组件和功能代码&#xff08;对Trae赶兴趣的可以看之前的文章《TraeAi上手体验》&#xff09;&#xff0c;刚好在用uniapp开发微信小程序时需要开发一个输入密码的弹框组件&#xff0c;于是想用Trae来实现。原型设计稿如下&#xff1a;…

华为AP 4050DN-HD的FIT AP模式改为FAT AP,家用FAT基本配置

在某鱼买了两台华为AP 4050DN-HD , AP是二手的 , 在AC上上过线 , 所以就不能开机自选为FIP模式了 我没有AC无线控制器 , 就是买一个自己玩 , AP又是FIT瘦AP模式 ,所以我就想把AP的瘦AP模式改为FAT胖AP模式 1. 准备工作 1.1下载好对应软件&#xff0c;进入到 企业业务网站去下…

vue3+ts+uniapp+unibest 微信小程序(第二篇)—— 图文详解自定义背景图页面布局、普通页面布局、分页表单页面布局

文章目录 简介一、自定义背景图布局1.1 效果预览1.2 实现思路1.3 custom-page 组件全量代码1.4 页面使用 二、普通页面布局2.1 效果预览2.2 实现思路2.3 公共样式部分2.4 页面使用 三、分页表单页面布局3.1 效果预览3.2 实现思路3.3 页面代码 简介 开发工具&#xff1a;VsCode…

虚拟机缩放比例问题处理

上班打开虚拟机的样子。 最开始判断可能是vmtools 异常重启安装后发现没有效果 通过 xrandr 功能查询显示器信息获取显示器名 设置显示器 同时设置分辨率 也可以同时设置刷新率 注意下图中设置的关键字

【Python 入门基础】—— 人工智能“超级引擎”,AI界的“瑞士军刀”,

欢迎来到ZyyOvO的博客✨&#xff0c;一个关于探索技术的角落&#xff0c;记录学习的点滴&#x1f4d6;&#xff0c;分享实用的技巧&#x1f6e0;️&#xff0c;偶尔还有一些奇思妙想&#x1f4a1; 本文由ZyyOvO原创✍️&#xff0c;感谢支持❤️&#xff01;请尊重原创&#x1…

DeepSeek-R1-Zero:基于基础模型的强化学习

注&#xff1a;此文章内容均节选自充电了么创始人&#xff0c;CEO兼CTO陈敬雷老师的新书《自然语言处理原理与实战》&#xff08;人工智能科学与技术丛书&#xff09;【陈敬雷编著】【清华大学出版社】 文章目录 DeepSeek大模型技术系列四DeepSeek大模型技术系列四》DeepSeek-…

(dp 买入股票的最佳时机)leetcode 121

题目 题解的dp数组 0列是负数&#xff0c;这里我改成正数不再相加而是相减获取利润 class Solution { public:int maxProfit(vector<int>& prices) {int nprices.size();vector<vector<int>>dp(n,vector<int>(2));dp[0][0]prices[0];dp[0][1]0;//0…