刷题训练之模拟

简介: 刷题训练之模拟

> 作者:დ旧言~

> 座右铭:松树千年终是朽,槿花一日自为荣。

> 目标:熟练掌握模拟算法。

> 毒鸡汤:学习,学习,再学习 ! 学,然后知不足。

> 专栏选自:刷题训练营

> 望小伙伴们点赞👍收藏✨加关注哟💕💕



🌟前言分析

       最早博主续写了牛客网130道题,这块的刷题是让同学们快速进入C语言,而我们学习c++已经有一段时间了,知识储备已经足够了但缺少了实战,面对这块短板博主续写刷题训练,针对性学习,把相似的题目归类,系统的刷题,而我们刷题的官网可以参考:


⭐知识讲解

基本思想:

模拟算法 == 依葫芦画瓢解题思维要么通俗易懂,要么就是找规律,主要难度在于将思路转换为代码。

特点:

相对于其他算法思维,思路比较简单(没有很多的弯弯绕绕,考察的是代码能力)。

大致做题流程:

模拟算法流程(一定要在演草纸上过一遍 - 容易忽略细节),把流程转换为代码


🌙topic-->1

题目链接:1.模拟-



题目分析:

给一个字符串,替换该字符串全部的  ? 字符,把该  ? 修改成若干个小写字母,但是这个字符串不能有重复的小写字母。

算法原理:

  • 解法:采用模拟是的思路讲解


图解:


代码演示:

class Solution
{
public:
  string modifyString(string s)
  {
    int n = s.size();
    for (int i = 0; i < n; i++)
    {
      if (s[i] == '?') // 替换
      {
        for (char ch = 'a'; ch <= 'z'; ch++) // 修改成小写字母
        {
                    // 细节问题
          if ((i == 0 || ch != s[i - 1]) && (i == n - 1 || ch != s[i + 1]))
          {
            s[i] = ch;
            break;
          }
        }
      }
    }
    return s;
  }
};


🌙topic-->2

题目链接:2.模拟



题目分析:

题目说的是:给一个数组(这个数组的元素说明了在第几秒发出攻击),给一个 duration ,这个变量是攻击时产生被毒的时间,统计该人物被中毒的时间是多少。

算法原理:

  • 解法:采用模拟是的思路讲解

图解:



代码演示:

class Solution 
{
public:
  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; // x > d
      else ret += tmp; // x < d
    }
    return ret + duration; // 最后一个元素加上 d
  }
};


🌙topic-->3

题目链接:3.模拟



题目分析:

给一个字符串,根据给定的行数numRows,从上往下,从左到右 Z 字形排列。

算法原理:

  • 解法一:创建一个二维数组,之后遍历字符串,时间复杂度为O(N²),空间复杂度为O(N²)
  • 解法二:采用模拟算法(本质上找规律,减少时间复杂度和空间复杂度)

图解:



代码演示:

class Solution 
{
public:
    string convert(string s, int numRows) 
    {
        // 处理边界情况(只有一行)
        if(numRows == 1)
            return s;
        
        string ret;
        int d = 2 * numRows - 2;// 公差
        int n = s.size();// 字符个数
 
        // 处理第一行
        for(int i = 0;i < n;i += d)
            ret += s[i];
        
        // 处理 K 行
        for(int k = 1;k < numRows - 1;k++) // 枚举 k 行
        {
            for(int i = k,j = d - k; i < n || j < n;i += d,j +=d)// 两个元素
            {
                if(i < n)// 细节
                    ret += s[i];
                if(j < n)// 细节
                    ret += s[j];
            }
        }
 
        // 处理最后一行
        for(int i = numRows - 1;i < n;i += d)
            ret += s[i];
 
        // 返回
        return ret;
    }
};


🌙topic-->4

题目链接:4.模拟



题目分析:

这个题目可能有点抽象,简单来说就是一个读数问题,如何读呢?

第一项:1

第二项我们就需要读第一项数字:一个一,简化为 11

第三项我们就需要读第二项数字:两个一,简化为21

第四项我们就需要读第三项数字:一个二,一个一,简化为:1211

.....

算法原理:

  • 解法:采用模拟的算法 + 双指针算法


图解:

代码演示:

class Solution {
public:
    string countAndSay(int n) 
    {
        // 初始字符串为 1 
        string ret = "1";
        // 循环 n-1 就可以了
        for(int i = 1;i < n;i++)
        {
            string tmp; // 交换变量
            int len = ret.size(); // 计算当前字符串长度
            for(int left = 0,right = 0;right < len;) // 双指针算法
            {
                while(right < len && ret[left] == ret[right]) // 找到没有相同就可以追加了
                    right++;
                tmp += to_string(right - left) + ret[left];// 不要忘记把自己追加上 ret[left]
                left = right;
            }
            ret = tmp;// 迭代
        }
        return ret;
    }
};


🌙topic-->5

题目链接:5.模拟



题目分析:

给你一个字符串 croakOfFrogs,它表示不同青蛙发出的蛙鸣声(字符串 "croak" )的组合。由于同一时间可以有多只青蛙呱呱作响,所以 croakOfFrogs 中会混合多个 “croak”

算法原理:

  • 解法:采用模拟的算法 + 哈希桶


图解:

代码演示:

class Solution
{
public:
  int minNumberOfFrogs(string croakOfFrogs)
  {
    string t = "croak";
    int n = t.size();
    vector<int> hash(n); // ⽤数组来模拟哈希表
    unordered_map<char, int> index; //[x, x这个字符对应的下标]
    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[0]++;
      }
      else
      {
        int i = index[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];
  }
};


🌟结束语

      今天内容就到这里啦,时间过得很快,大家沉下心来好好学习,会有一定的收获的,大家多多坚持,嘻嘻,成功路上注定孤独,因为坚持的人不多。那请大家举起自己的小手给博主一键三连,有你们的支持是我最大的动力💞💞💞,回见。


目录
相关文章
|
监控 安全 网络安全
|
存储 前端开发 JavaScript
基于Web的线上影院订票系统的设计与实现
基于Web的线上影院订票系统的设计与实现
388 0
|
4月前
|
传感器 算法 数据格式
【UAV】改进的多旋翼无人机动态模拟的模块化仿真环境(Matlab、Simulink实现)
【UAV】改进的多旋翼无人机动态模拟的模块化仿真环境(Matlab、Simulink实现)
222 0
|
8月前
|
人工智能 JSON 前端开发
分享一个非常实用的在线AI工具网站
在线工具网是一个包含AI工具、站长工具、开发人员工具、实用工具、AI助手,能够提供最新AI知识库、在线编码、正则表达式、加密解密、二维码生成、在线进制转换、JSON解析格式化、JavaScript、css、httml格式化/混淆/压缩、时间戳转换等免费在线AI工具平台。
321 34
|
人工智能 分布式计算 搜索推荐
元宇宙:通往未来数字世界的入口
【10月更文挑战第27天】元宇宙,一个融合虚拟现实、增强现实、人工智能和区块链等技术的多维度数字世界,正成为连接现实与虚拟的桥梁。它不仅提供沉浸式的社交、娱乐和商业体验,还预示着数字时代的深刻变革,对经济、文化和社会产生深远影响。本文探讨元宇宙的定义、特征、关键技术及其未来影响。
|
Android开发
Android基于gradle task检查各个module之间资源文件冲突情况
Android基于gradle task检查各个module之间资源文件冲突情况
Android基于gradle task检查各个module之间资源文件冲突情况
|
9月前
|
前端开发 测试技术 PHP
任务悬赏接单发布系统PHP源码
任务发布接单系统,目前最新最完善的一套源码,前后端全开源无加密,支持会员系统、 支持店铺认证 支持普通任务和线下任务 支持微信支付和支付宝支付 短信对接短信宝
407 13
|
开发者 iOS开发 MacOS
【干货】玩转PyCharm
【干货】玩转PyCharm
|
SQL 安全 PHP
PHP安全性深度探索:防范常见漏洞与最佳实践####
本文深入剖析了PHP开发中常见的安全漏洞,包括SQL注入、XSS攻击、CSRF攻击及文件包含漏洞等,并针对每种漏洞提供了详尽的防御策略与最佳实践。通过实例分析,引导读者理解如何构建更加安全的PHP应用,确保数据完整性与用户隐私保护。 ####
|
缓存 JavaScript 前端开发
深入理解 Vue 3 的 Composition API 与新特性
本文详细探讨了 Vue 3 中的 Composition API,包括 setup 函数的使用、响应式数据管理(ref、reactive、toRefs 和 toRef)、侦听器(watch 和 watchEffect)以及计算属性(computed)。我们还介绍了自定义 Hooks 的创建与使用,分析了 Vue 2 与 Vue 3 在响应式系统上的重要区别,并概述了组件生命周期钩子、Fragments、Teleport 和 Suspense 等新特性。通过这些内容,读者将能更深入地理解 Vue 3 的设计理念及其在构建现代前端应用中的优势。
504 1
深入理解 Vue 3 的 Composition API 与新特性