模拟 - #介绍 #题解

Codeforces Round #661 (Div. 3)题解 阅读详情

系列文章目录

  1. leetcode - 双指针问题_leetcode双指针题目-优快云博客
  2. leetcode - 滑动窗口问题集_leetcode 滑动窗口-优快云博客
  3. 高效掌握二分查找:从基础到进阶-优快云博客
  4. leetcode - 前缀和_前缀和的题目-优快云博客
  5. 动态规划 - 斐波那契数列模型-优快云博客
  6. 位运算 #常见位运算总结 #题解-优快云博客

文章目录

目录

系列文章目录

文章目录

前言

一、什么是模拟

二、题解

1、题1 替换所有的问号:

解法:模拟

参考代码1:

参考代码2:

2、题目2 提莫攻击:

解法:模拟

参考代码:

3、题3 Z 字形变换 :

解法一:模拟

参考代码:

解法二:找规律

参考代码:

4、题4 外观数列 :

解法:模拟实现

参考代码:

5、题五 数青蛙 :

解法:模拟

参考代码:

总结


前言

路漫漫其修远兮,吾将上下而求索;


大家可以自己先做一下喔~

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

495. 提莫攻击 - 力扣(LeetCode)

6. Z 字形变换 - 力扣(LeetCode)

38. 外观数列 - 力扣(LeetCode)

1419. 数青蛙 - 力扣(LeetCode)


一、什么是模拟

通俗来讲,模拟就是照葫芦画瓢;即根据题干已经告诉我们的思路来转换成代码来解决这些问题;

模拟题的特点:这类题比较简单,考察的就是我们的代码能力

做模拟题的一般过程:

  • 1、先模拟算法流程;千万不能凭空想象,需要实际在草稿纸上过一遍思路,不然容易忽略细节问题;
  • 2、将思路流程转换成代码;

二、题解

1、题1 替换所有的问号:

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

解法:模拟

题意:将字符串中所有为 '?' 的字符转换成小写字母,并且还需要保证字符串中没有连续重复的字符;

遍历 + 替换 : 从前往后扫描该数组,如若遇到问号则从 'a' 到 'z' 依次尝试放在该位置是否合适(不与相邻的字符相同)

细节处理:当问号在第一个的时候,只需要与其后一个字符进行比较;当问号在最后一个的时候,只需要与其一个字符进行比较;

参考代码1:

    string modifyString(string s) 
    {
        //遍历+替换
        int n = s.size();
        for(int i = 0;i<n;i++)
        {
            if(s[i]=='?')
            {
                //替换
                for(int j = 'a';j<='z';j++)
                {
                    //判断
                    //细节处理,第一个以及最后一个
                    if(i==0 || i==n-1) 
                    {
                        if((i==0 && s[i+1]!=j) || (i==n-1 && s[i-1]!=j))
                      {  s[i] = j;
                        break;}
                    }
                    else//中间的
                    {
                        if(s[i-1]!=j && s[i+1]!=j)
                        {
                            s[i] = j;
                            break;
                        }
                    }
                }
            }
        }
        return s;
    }

代码1有点冗余,我们可以巧妙利用 && 与 || 的逻辑进行优化;

参考代码2:

    string modifyString(string s) 
    {
        //遍历+替换
        int n = s.size();
        for(int i = 0;i<n;i++)
        {
            if(s[i]=='?')
            {
                //替换
                for(int j = 'a';j<='z';j++)
                {
                    //判断
                    if((i==0 || s[i-1]!=j) && (i==n-1 || s[i+1]!=j))
                    { 
                        s[i] = j;
                        break;
                    }
    
                }
            }
        }
        return s;
    }

2、题目2 提莫攻击:

495. 提莫攻击 - 力扣(LeetCode)

解法:模拟

讲解算法原理:当两个时间点(假设为a、b点)的差值大于等于中毒时间(假设中毒实现为d)的时候,说明在 a 点受到攻击之后,接下来在 b 前中毒之前可以恢复,那么中毒状态为 d秒;

而当两个时间点的查找小于 d 的时候,说明在a 点受到攻击之后接下来在 b 点中毒之前不可以恢复,那么此时中毒状态为 b-a ;

细节处理:如果最后一次中毒,直接加上 d 秒即可;

参考代码:
    int findPoisonedDuration(vector<int>& timeSeries, int duration) 
    {
        int ret = 0;
        for(int i = 1;i<timeSeries.size();i++)
        {
            int tmp = timeSeries[i]-timeSeries[i-1];
            if(tmp >= duration) ret += duration;
            else ret+=tmp;
        }
        //处理最后一次中毒
        return ret + duration;
    }

3、题3 Z 字形变换 :

6. Z 字形变换 - 力扣(LeetCode)

解法一:模拟

首先将字符串按照题干中的要求放入矩阵之中,然后再一行一行地从矩阵中读取数据;

Q:矩阵地大小如何确定?

  • 行,开辟字符串的长度肯定是没有问题的;列,题干中会给;

参考代码:
    string convert(string s, int numRows) 
    {
        //完全按照题干的思路来实现
        vector<vector<char>> nums(numRows,vector<char>(s.size() ,' '));//char 类型的二维数组。用空格初始化
        //将数据放入nums 中
        //先放第一列
        int i  = 0, j = 0;//nums 中的指针
        int sz = 0;//s 中的指针
        while(s[sz]!='\0'  && i < numRows)
        {
            nums[i][j] = s[sz++];
            i++;
        }
        j++;//第二列
        while(s[sz]!='\0' )
        {
            //判断是需要填一列,还是填一个
            //numRows 可能为1,需要先判断一下
            int n = numRows-1;
            if(n==0)//填一列,即nusRows 个
            {
                i = 0;
                while(s[sz]!='\0'  && i<numRows)
                {
                    nums[i++][j] = s[sz];
                    sz++;
                }
                j++;
            }
           
            while(n--)
            {
                if(n==0)//填一列
                {
                    i = 0;
                    while(s[sz]!='\0' && i<numRows)
                    {
                        nums[i++][j] = s[sz];
                        sz++;
                    }
                    j++;
                }
                else//填一个
                {
                   if(s[sz]!='\0') nums[n][j++] = s[sz++];
                }
            }
        }
         //读取nums 中的数据
         string ret;
         for(int x = 0;x < numRows;x++)
         {
            for(int y = 0;y<s.size();y++)
            {
                if(nums[x][y] !=' ') ret += nums[x][y];
            }
         }
         return ret;
    }

这种解法的时间、空间复杂度为:O(N*len);效率不太好;

如何在模拟的策略上进行优化?

  • 大多数的模拟题的优化策略均是找规律!

Q:如何找规律?

  • 最好将原始的模型结果画出来,然后根据画出来的最终结果来反推规律;当推出来的一个规律的时候,再换一种规律来验证我们的这个规律是否正确;当我们通过了两个例子来验证我们的规律是否正确的时候,此时便可以上手写代码了;

解法二:找规律

eg. n = 4;

第一行: 0 -> d+0 -> d+d+0 -> ... 

假设公差为d:

显然d = 2*n -2 = 6;所以 d 的计算公式为 2*n -2;

第二行:

第三行:

假设第一个数为k;

第1~n-2 行 :两两向后递进:(k,d-k) -> (k+d,d-k+d) -> (k+d+d, d-k+d+d) -> (k+d+d+d,d-k+d+d+d) -> ...

简化一下: (k,d-k) -> (k+d,2d-k) -> (k+2d,3d-k) -> (k+3d,4d-k) -> ...

第四行:

第 n 行:n-1 -> n-1 + d -> n-1 + 2d -> ...  n-1+xd 

需要确保 n-1 + xd < s.size() 就可以了;

找到规律之后,我们需要验证一下:当 n 为3 , 是否还符合此规律:

我们再思考一下比较特殊的情况,是否会符合上述的规律:而当 n 为 1 的时候, d = 0; 不符合上述逻辑,需要特殊处理;

参考代码:
    string convert(string s, int n) 
    {
        //边界情况处理
        if(n==1) return s;
        //根据规律进行优化
        string ret;
        int d = 2*n - 2;
        //第一行 
        for(int i =0;i<s.size();i+=d) ret+=s[i];
        //中间行 1~n-2 行
        for(int k = 1;k<=n-2;k++)//枚举每一行
        {
            for(int i = k, j = d-k;i<s.size() || j<s.size();i+=d,j+=d)//两两一组
            {
                //需要保障不能越界
                if(i<s.size()) ret+=s[i];
                if(j<s.size()) ret+=s[j];
            }
        }
        //处理最后一行
        for(int i = n-1;i<s.size();i+=d) ret+=s[i];
        return ret; 
    }

4、题4 外观数列 :

38. 外观数列 - 力扣(LeetCode)

解法:模拟实现

Q:如何“解释”字符串?

  • 找到一个连续的字符串部分就需要进行解释,找到相同的字符串部分就进行解释……

利用双指针;

参考代码:
    string countAndSay(int n) 
    {
        //个数+字符,模拟实现
        string ret = "1";
        for(int i = 1;i<n;i++)//执行n-1 次
        {
            string tmp;
            int len = ret.size();
            //双指针
            for(int left = 0, right = 0; right < len; )
            {
                //left 和 right 锁定区间
                while(right < len && ret[right]==ret[left]) right++;
                //走到此处就说明,right - left 的结果是 ret[left]字符的个数
                tmp+=to_string(right-left) + ret[left];
                left = right;//继续迭代
            }
            ret = tmp;//继续迭代
        }
        return ret;
    }

5、题五 数青蛙 :

1419. 数青蛙 - 力扣(LeetCode)

解法:模拟

当遍历到 r 字符的时候,仅需要看前面是否有青蛙叫出 'c' 这个字符……同理,遍历到 'o' 字符,仅需要看前面是否有青蛙叫出 'r' 这个字符……

显然,本题在模拟的过程之中需要时刻统计出来前面的这些字符出现的情况;为了提高效率,我们可以借助于哈希表来实现;

思路总结:

参考代码:
    int minNumberOfFrogs(string croakOfFrogs) 
    {
        //利用hash 来统计,提高效率
        int hash[5] = {0};//下标映射对应 c r o a k 
        //再使用unordered_map 来记录下标与字符的映射关系
        unordered_map<char,int> index;
        string t = "croak";
        //将“croak” 放入hash 中
        int n = t.size();
        for(int i = 0;i<n;i++) index[t[i]] = i;

        //遍历目标字符串
        for(auto ch : croakOfFrogs)
        {
            if(ch == 'c') //先看是否有青蛙刚好叫完
            {
                if(hash[n-1] != 0) hash[n-1]--;
                hash[index[ch]]++;
            }
            else// r o a k
            {
                //判断前驱字符是否存在
                int i = index[ch];
                if(hash[i-1] == 0) return -1;//没有前驱字符直接返回 -1
                else
                {
                    hash[i-1]--;
                    hash[i]++;
                }
            }
        }
        //走完了,还需要判断hash 中 'k' 前面的是否均为0
        for(int i = 0;i<n-1;i++)
        {
            if(hash[i]) return -1;
        }

        return hash[n-1];
    }

总结

模拟题的关键在于:

1. 先在草稿纸上模拟算法流程

2. 注意边界条件处理

3. 寻找优化规律

4. 将思路转换为代码

【LGR-142-Div.4】洛谷入门赛 #13 考后分析与题解 阅读详情

相关推荐

Windows 10 下 Nacos 3.0.2 单机版保姆级安装教程(含JDK 17配置与MySQL 8.0连接避坑)

本文提供Windows 10下Nacos 3.0.2单机版的详细安装教程,涵盖JDK 17配置、MySQL 8.0连接优化及生产级安全设置。通过步骤详解和常见问题解决方案,帮助开发者快速完成Nacos的安装与配置,确保服务发现与配置管理的高效运行。

weixin_29237635的博客 320

洛谷P4957 [COCI 2017/2018 #6] Alkemija题解

题目解法摘要 本题采用模拟方法解决化学反应问题。初始时使用给定物质集合,通过不断执行能进行的反应扩展物质集合,直到无法获得新物质为止。 优化思路: 建立物质到反应的索引,快速查找需要当前物质的反应 维护每个反应未获得物质的数量,当降为0时执行反应 时间复杂度优化至O(N+K+Σ(Li+Ri)),其中每个物质和反应仅被处理有限次 该方法通过必要条件判断有效减少了不必要的反应检查,同时利用辅助数组记录反应状态确保正确性。

zpy的博客 972

从内外参推导IPM变换方程及代码实现(生成AVM环视拼接图)

最近想实现AVM拼接,看了不少博客和论文,不过比较愚钝,一直没能很好理解原理,尤其是怎么在实现时把下文中Z1和Z2消除的,所以严谨的推导了一下对应的公式,如有不对,水平有限,烦请指出~IPM变换(逆透视变换),顾名思义,即将正常透视效应消除的变换,变换结果为鸟瞰图BEV(俯视图);AVM环视拼接一般是将车身前后左右的四个鱼眼相机拼接成环视图(也是俯视),其使用的单应矩阵将四个相机转到同一个俯视坐标系。

mxdsdo09的博客 4173

【题解】[COCI2020-2021#1] Tenis

solution: 恶心题。考点:位运算 + 模拟。 我们将比赛分成两类:第一种是严格的胜利,即赢家的获胜位置严格小于输家的获胜位置。第二种是非严格的胜利,这意味着球员在球场上的获胜位置是相等的。 现在问题转化为在一个 3 列的网格上统计。提供 kcznolkcznolkcznol 大佬的 O(n)O(n)O(n) 算法,暴踩标算: 从左往右扫一遍,对于这一列的每个球员是第一次出现,那么我们统计 (i+1,n)(i+1,n)(i+1,n) 的答案;否则直接跳过。具体我们要维护 cnt[8][3]cnt[8

cqbzlydd的博客 574

Windows 11下用Ollama一键部署DeepSeek-R1大模型(附8B/14B版本选择建议)

本文详细介绍了在Windows 11环境下使用Ollama工具一键部署DeepSeek-R1大模型的完整指南,包括8B和14B版本的选择建议。通过硬件评估、安装配置、性能优化等步骤,帮助开发者高效实现本地部署,提升AI应用体验。

weixin_29079643的博客 272

微信小程序 - 解决web-view嵌套H5网页白屏问题,将h5网页嵌套在webview页面出现无法加载一片空白,详解微信小程序<web-view>页面跳转出现白屏情况(无论本地还是线上H5都能解决)

微信小程序解决web-view打开网页在手机上出现白屏的问题,小程序web-view嵌套H5项目白屏问题分析及解决,使用web-view组件加载H5网页链接后白屏情况,小程序嵌套的h5网页中跳转页面时也有可能出现白屏问题,嵌套webview页面时,出现白屏,WebView 加载不出网页,微信小程序<web-view>页面跳转出现白屏解决方法,解决WebView白屏空白,H5内嵌第三方小程序打开白屏,微信小程序嵌入h5页面加载空白,微信小程序web-view跳转h5白屏,解决微信小程序web-view打开网页

🏆 前端领域优质创作者 1万+

Codeforces Round #268 (Div. 2) ABCD

CF469 Codeforces Round #268 (Div. 2) http://codeforces.com/contest/469 开学了,时间少,水题就不写题解了,不水的题也不写这么详细了。 A 水题 1 //#pragma comment(linker, "/STACK:102400000,102400000") 2 #include<cstdi...

weixin_34407348的博客 143

YOLOv8极速瘦身实战:LAMP剪枝让模型又快又准

一个庞大的模型虽然强大,但在实际部署,尤其是资源受限的边缘设备(如无人机、移动电话、嵌入式系统)上,却面临着严峻的挑战:高昂的内存占用、巨大的计算量以及随之而来的高延迟和高能耗。本教程从LAMP剪枝的深刻理论出发,详细解释了它如何通过最小化最坏情况下的L2失真,并借助巧妙的数学简化,最终推导出一种高效、无超参数、层自适应的剪枝策略。它如同为臃肿的模型进行一次精准的“瘦身手术”,通过移除网络中冗余或不重要的权重、神经元甚至整个结构,来显著降低模型的参数量和计算量(FLOPs),从而实现推理加速和资源节约。

FJN110的博客 258

Codeforces Round #733 2021-07-17

Problem C:Pursuit 题意: :双人博弈, 进行n次阶段,每人每回合可以增加0 ~ 100分,总分取前n - (n / 4) 位较高分之和,求出使你赢下游戏最少还需进行的回合次数。 知识点: 贪心、二分 ` **题解:**根据贪心思想,若使得获得游戏胜利所需的回合数最小,则对方之后每回合应得分最少,而我方应得分最多,即为之后的回合我方得分为100,对方为0。可以看出,获得游戏胜利所需的回合数不会超过 n 次( 总分达到n * 100 必定满足条件),由此可以令[0, n]作为二分写法的初始范围

qq_51803703的博客 291

利用插件扩展 Qt 应用程序

不仅 Qt 本身可以通过插件进行扩展,而且 Qt 应用程序也可以通过插件来扩展,这需要应用程序使用 `QPluginLoader` 检测和加载插件。

青春不老,奋斗不止! 1万+

在 ABAP 世界把 SAML 2.0 玩明白:跨域 SSO 的通信模式、配置路径与落地实践

摘要 SAML 2.0是ABAP平台实现标准化SSO的推荐方案,提供Front-Channel(浏览器传递SAML报文)和Back-Channel(使用工件绑定通过SOAP兑换断言)两种通信方式。前者包括HTTP Redirect和POST绑定,后者通过Artifact绑定提升安全性。配置重点包括:激活ICF服务、使用SAML2事务码建立信任、设置用户标识映射、选择绑定方式(POST易调试、Artifact更安全)及配置安全策略(签名/加密)。典型流程包括SP-initiated和IdP-initiated

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 293

题解 | #2020年毕业的人中最喜欢用Java的用户#

各位uu有同样情况的吗?最后保留的是四个1. 腾讯ailab ssp,研究岗,有股有签,总包第三,54+低于百度2. 华为15级31k,base第三,总包略低3. 百度搜广推,base。bg双9硕,已签三方,华为审批通过,确定解约后发意向薪资上三者差不太多,base都在上海华为:总包n,根据薪资推测定级是15b,公积金5%纳芯微:总包n+3,还。网上劝退这俩的都挺多的,奈何实在没有别的offer了,如果这里面挑一个,选哪个四院四部,试验集成中心,总包25,地点北京门头沟,加班多,100天出差,去靶场一院。

han_xue_feng的博客 1713

YOLO11改进|注意力机制篇|引入ELA注意力机制

YOLO11添加ELA注意力机制

A1983Z的博客 3648

题解 | #模拟逻辑芯片#

链接:https://ac.nowcoder.com/acm/problem/19800来源:牛客网题目描述小 A 有一棵长的很奇怪的树,他由 n 条链和 1。这道题还是暴露我不少的问题~在参考了排行榜的大佬才解决的由于边界条件以及查询过程中索引变化的问题导致我一开始需要添加非常多的前置条件才可以通过测试qaq我一开始。苏州工业园区生物产业园有什么推荐的公司吗,不知道还招不招人。2023暑假打卡第20天。

2301_78234743的博客 97

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

【CH Round #48 - Streaming #3(NOIP模拟赛Day1)】 题解

飞机票:http://www.contesthunter.org/contest/CH%20Round%20%2348%20-%20Streaming%20%233%20(NOIP%E6%A8%A1%E6%8B%9F%E8%B5%9BDay1)

benben_lin的专栏 703

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

NOI Online #3 rm组 题解

NOI Online #3 入门组题解 洛谷题目链接:最急救助,观星,买表 。 Problem 1:\texttt{Problem 1:}Problem 1:最急救助 这题很简单,直接模拟即可。 复杂度:O(NM)O(NM)O(NM) (设字符串长度为 MMM ) 注意不要再循环里面通过 .size() 函数求长度,由于是 unsigned 类型,所以如果长度为 111 会溢出,而且还会增高复杂度,复杂度会变成 O(NM2)O(NM^2)O(NM2) (虽然这个复杂度也可以 AC\col

qym2008 的博客 417

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

题解 | #FF小红不想做模拟题,非线段树,暴力,考虑并查集的方法优化#

一开始问的太离谱,跟HR面一样(笑死)自我介绍你的笔试分蛮高的,就不让你手撕算法了,你觉得你是正常发。今天和家里打电话突然聊到考研,我就说我认识的高中同学很多都上岸了,还有原专业的同学也很多考上了92,2硕,成都人,铁路子弟1.成都铁路局,要去一线干几年,熬夜但稳定,待遇一般;24应届,考研错过秋招,春招投了一个多月了,还是0,救大命,有没有人可以内推我,呜呜呜呜呜呜,最好是。背景:某大模型公司,想同学做计算机题目的数据标注,一道题给3-5块钱,就是标注模型哪个回答更好。

华鑫的专栏 1522

题解 | #24点运算# 为啥我这个dfs比直接循环还复杂

同标题,投的米哈游日常实习,但是今天看流程已经说简历不合适了,但是晚上又收到了暑期实习的笔试,这个做了还有用吗,我都没投那个暑期岗,笔试没过对后面再投有影响吗,2月29日,专业面,约30min-------上来先自我介绍,说一下自己面试的岗位我觉得还是有必要的,我面试的时候就感觉面试官还在看我的简历,首先一定要知道华为。还问我哲学问题,说我逻辑。碎碎念本科毕业暂时不深造,秋招末尾签了个965的岗位,据说是不加班,双休,钱给的也还行(总包加上两边公积金算20吧),心里踏实了一点按理说我应该挺满意的,但春招。

2301_79125642的博客 1469

Codeforces Round #386 (Div.2)部分题解

Codeforces Round #386 (Div.2)部分题解经历几次cf降分之后,终于一次rating上升了,继续努力。A. Compote 题意: a lemons, b apples and c pears的比例要为1:2:4, 输出最大的a+b+c。思路:取a/1,b/2,c/4中的最小值t,t与1,2,4分别相乘再相加即为答案。#include<iostream> using

启人zhr的博客 833

Codeforces Round #640 (Div. 4) 题解

CF出div4了,我的青春结束了 第一场div4的话就我的体验来说前面几道比较偏模拟,后面几道比较偏构造思维,个人体验还行 (注意:由于还未终测所以代码不保证正确性,AB以外的题没写题意简述) 本文同步发布于个人博客 A. Sum of Round Numbers 题意简述 TTT组数据,给你一个数字nnn,要你用最少的round number表示出nnn,round number意思是最左边不为000,其他都为000的数字,其实就是k⋅10xk\cdot 10^xk⋅10x这样 数据范围 1≤t≤104,

songhn的博客 420
上一篇: C++ - string 的使用 #auto #范围for #访问及遍历操作 #容量操作 #修改操作 #其他操作 #非成员函数
下一篇: leetcode - 分治-三路划分快速排序总结
秦少游在淮海
博客等级 码龄3年 1071粉丝 88原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值