算法思想总结:模拟算法

一、模拟算法的总结

1、本质:比葫芦画瓢

2、特点:思路较简单,根据题目要求即可,代码量和细节较多

3、解决方法:

    (1) 模拟算法流程,在草稿纸上进行演算

    (2) 认真审题,考虑细节问题和边界情况

    (3) 一步步将流程转化为代码

二、替换所有的问号

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

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

三、提莫攻击

. - 力扣(LeetCode)提莫攻击

class Solution {
public:
    int findPoisonedDuration(vector<int>& timeSeries, int duration) 
    {
        int n=timeSeries.size();
        int ret=0;//记录总中毒时间
        for(int i=1;i<n;++i) 
        {
            int temp=timeSeries[i]-timeSeries[i-1];
            //如果后一次的中毒时间没有被覆盖,就是+duration 覆盖了就是+temp
            if(temp>=duration) ret+=duration; else ret+=temp;
        }
        return ret+duration;//最后还有一次持续时间!!
    }
};

四、Z字形变换

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

class Solution {
public:
    string convert(string s, int numRows) 
    {
       if(numRows==1) return s;//处理边界情况
       string ret;
       int n=s.size(),d=2*numRows-2;//d是公差
       //先处理第一行
       for(int i=0;i<n;i+=d) ret+=s[i];
       //处理中间的行
       for(int k=1;k<numRows-1;++k)//遍历行
           for(int i=k,j=d-k;i<n;i+=d,j+=d)
           {
                  ret+=s[i];
                  if(j<n) ret+=s[j];//可能i没越界但是j越界了
           }
       //处理最后一行;i+=d) ret+=s[i];
       for(int i=numRows-1;i<n;i+=d) ret+=s[i];
       return ret;
    }
};

五、外观数列

. - 力扣(LeetCode)外观数列

class Solution {
public:
    string countAndSay(int n) 
    {
      string ret("1");//基准样例
      for(int i=1;i<n;++i)
      {
        string temp;//每次都要更新
        int len=ret.size();
        //定义双指针 从前往后遍历相同的区域
        for(int left=0,right=0;right<len;)
        {
            while(right<len&&ret[left]==ret[right]) ++right;//相等就一直走
            //找到该区域了,就temp加上这块区域
            temp+=to_string(right-left)+ret[left];
            left=right;//更新left;
        }
        ret=temp;//找完后,更新即可
      }
      return ret;
    }
};

六、数青蛙

. - 力扣(LeetCode)数青蛙

 写法1: 两个哈希表  一个存储字符和下标的映射关系,另一个用数组模拟哈希表存字符出现的次数。

class Solution {
public:
    int minNumberOfFrogs(string croakOfFrogs) 
    {
       //对于roak来说,判断前驱字符是否在哈希表中
       //在就--前驱  ++当前     不在 返回1
       //对于c来说,要判断k是否在哈希表中,如果在就--k然后++c  如果不在就直接++c
       string t="croak";
       int n=t.size();
       int hash[5]={0};//存储字符信息
       unordered_map<char,int> index;//用来建立字符和下标的映射关系
       for(int i=0;i<n;++i)  index[t[i]]=i;//建立t字符串各字符和下标映射关系
       for(auto ch:croakOfFrogs)//开始研究
       {
        if(ch=='c')
        {
           if(hash[n-1]!=0) --hash[n-1];
           ++hash[index[ch]];
        }
        else
        {
            int i=index[ch];
            if(hash[i-1]==0) return -1;
            ++hash[i];
            --hash[i-1];
        }
       }
       for(int i=0;i<n-1;++i)  if(hash[i]!=0) return -1;//最后还要再检查一次
       return hash[n-1];
    }
};

写法2:只用一个数组模拟的哈希表,手动去控制字符和下标的映射关系(用switch语句) 

class Solution {
public:
    int minNumberOfFrogs(string croakOfFrogs) 
    {
       //对于roak来说,判断前驱字符是否在哈希表中
       //在就--前驱  ++当前     不在 返回1
       //对于c来说,要判断k是否在哈希表中,如果在就--k然后++c  如果不在就直接++c
       int hash[5]={0};//0 1 2 3 4 分别对应c r o a k
       int n=croakOfFrogs.size();
       for(int i=0;i<n;++i)
       {
        switch(croakOfFrogs[i])
        {
            case 'c':
            if(hash[4]) --hash[4];
            ++hash[0];
            break;
            case 'r':
            if(hash[0]) 
            {
                --hash[0];
                ++hash[1];
            }
            else return -1;
            break;
            case 'o':
            if(hash[1]) 
            {
                --hash[1];
                ++hash[2];
            }
            else return -1;
            break;
            case 'a':
            if(hash[2]) 
            {
                --hash[2];
                ++hash[3];
            }
            else return -1;
            break;
            case 'k':
            if(hash[3]) 
            {
                --hash[3];
                ++hash[4];
            }
            else return -1;
            break;
        }
       }   
       //检查一下hash的前面是否都为0
       for(int i=0;i<4;++i) if(hash[i]) return -1; 
       return hash[4]; 
    }
};

七、频率跟踪器

. - 力扣(LeetCode)频率跟踪器

class FrequencyTracker {
public:
    FrequencyTracker() :freq(N),freq_count(N){} 
    
    void add(int number) 
    {
       --freq_count[freq[number]];//该数字原先次数的频率减少
       ++freq[number];//该数字次数增加
       ++freq_count[freq[number]];//该数字对应次数的频率增加(更新)
    }
    
    void deleteOne(int number) 
    {
       if(freq[number]==0) return;//可能没出现过
       //如果出现过,数字次数减少,原来频率要减少,先有频率要增加
       --freq_count[freq[number]];//该数字原先次数的频率减少
       --freq[number];//该数字次数减少
       ++freq_count[freq[number]];//该数字对应次数的频率增加(更新)
    }
    bool hasFrequency(int frequency)  {return freq_count[frequency];}
private:
     static const int N=100001;
     vector<int>  freq;//统计各个数字出现的次数
     vector<int>  freq_count;//统计各个频率的出现次数
};

 

 

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

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

相关文章

GAMMA数据处理问题(七)

phase_sim_orb报这个错是什么原因呢&#xff0c;说是我的hgt文件和模拟的干涉图行数不匹配&#xff0c;之前geocode生成hgt的参数不是在mli.par文件中看吗&#xff0c;为什么会出现行数不匹配的情况啊&#xff0c;难道不是par文件中里面看&#xff1f;&#xff1f;&#xff1f;…

【C++庖丁解牛】二叉搜索树(Binary Search Tree,BST)

&#x1f341;你好&#xff0c;我是 RO-BERRY &#x1f4d7; 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f384;感谢你的陪伴与支持 &#xff0c;故事既有了开头&#xff0c;就要画上一个完美的句号&#xff0c;让我们一起加油 目录 1. 二叉搜索树概念2. 二叉…

结构体内存对齐 offsetof 枚举 联合体

文章目录 结构体结构体内存对齐结构体嵌套结构体内存对齐的原因修改默认对齐数设置默认对齐数 #pragma pack() offsetof() 是宏 offset偏移量 of是谁的偏移量。计算结构体成员相对于结构体的起始位置偏移量是几。 结构体传参值传递地址传递 位段枚举联合 联合体 共用体联合体大…

【JS】深度学习JavaScript

&#x1f493; 博客主页&#xff1a;从零开始的-CodeNinja之路 ⏩ 收录文章&#xff1a;【JS】深度学习JavaScript &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 目录 一:JavaScript1.1 JavaScript是什么1.2 JS的引入方式1.3 JS变量1.4 数据类型1.5 …

LeetCode 热题 100 | 堆(二)

目录 1 什么是优先队列 1.1 优先队列与堆的关系 1.2 如何定义优先队列 1.3 如何使用优先队列 1.4 如何设置排序规则 2 347. 前 K 个高频元素 2.1 第 2 步的具体实现 2.2 举例说明 2.3 完整代码 3 215. 数组中的第 K 个最大元素 - v2 菜鸟做题&#xff0c;语…

【漏洞复现】科立讯通信指挥调度平台editemedia.php sql注入漏洞

漏洞描述 在20240318之前的福建科立讯通信指挥调度平台中发现了一个漏洞。该漏洞被归类为关键级别,影响文件/api/client/editemedia.php的未知部分。通过操纵参数number/enterprise_uuid可导致SQL注入。攻击可能会远程发起。 免责声明 技术文章仅供参考,任何个人和组织使…

2024公认口碑最好的洗地机有哪些?若看重清洁力,这四款最值得买

每当我们要清洁卫生时&#xff0c;是否总是感到腰酸背痛、疲劳不堪&#xff0c;甚至头昏眼花&#xff1f;地板是家中的重要门面&#xff0c;不容忽视的卫生焦点。如今&#xff0c;我们终于多了一位家务打扫的救星——家用洗地地机。一次操作&#xff0c;即可完成扫地除尘、地除…

Git 分布式版本控制系统基本概念和操作命令

目录 Git 基本概念 功能特点 工作流程 操作命令 新建代码库 配置 增删文件 代码提交 分支 标签 查看信息 远程同步 撤销 其他 小结 Git Git 是一个开源的分布式版本控制系统&#xff0c;用于跟踪文件的变更历史。它最初由 Linux Torvalds 设计&#xff0c;用于…

1+x中级题目练习复盘(八)

SQL 语句中进行 group by 分组时&#xff0c;可以不写 where 子句 在使用 select 语句进行查询分组时&#xff0c;如果希望去掉不满足条件的分组&#xff0c;使用 having 子句File 类的 isDirectory() 方法可以判断文件是否为目录 在使用 select 语句进行查询分组时&#xff0…

二.寄存器

1. 2. 例如&#xff1a;h即为high&#xff08;高位&#xff09;&#xff0c;l即为low&#xff08;低位&#xff09; 3.一个字是两个字节 4.在写一条汇编指令或一个寄存器的名称时不区分大小写。 5.al&#xff0c;ah&#xff0c;ax在接受汇编指令时&#xff0c;并不相等&…

33-Java服务定位器模式 (Service Locator Pattern)

Java服务定位器模式 实现范例 服务定位器模式&#xff08;Service Locator Pattern&#xff09;用于想使用 JNDI 查询定位各种服务的时候考虑到为某个服务查找 JNDI 的代价很高&#xff0c;服务定位器模式充分利用了缓存技术在首次请求某个服务时&#xff0c;服务定位器在 JNDI…

十三、MySQL基于GTID的半同步复制

目录 一、MySQL半同步复制 一、三种复制方式比较 1、异步复制 2、同步复制 3、半同步复制 4、半同步复制比较 5、半同步复制的特点 二、搭建半同步复制 1、如果不清楚Plugin的目录&#xff0c;用如下查找&#xff1a; 2、所有数据库服务器&#xff0c;安装半同步插件…

【Go实现】实践GoF的23种设计模式:解释器模式

上一篇&#xff1a;【Go实现】实践GoF的23种设计模式&#xff1a;适配器模式 简单的分布式应用系统&#xff08;示例代码工程&#xff09;&#xff1a;https://github.com/ruanrunxue/Practice-Design-Pattern–Go-Implementation 简介 解释器模式&#xff08;Interpreter Pat…

【STM32嵌入式系统设计与开发】——6矩阵按键应用(4x4)

这里写目录标题 一、任务描述二、任务实施1、SingleKey工程文件夹创建2、函数编辑&#xff08;1&#xff09;主函数编辑&#xff08;2&#xff09;LED IO初始化函数(LED_Init())&#xff08;3&#xff09;开发板矩阵键盘IO初始化&#xff08;ExpKeyBordInit()&#xff09;&…

JVM本地方法

本地方法接口 NAtive Method就是一个java调用非java代码的接口 本地方法栈&#xff08;Native Method Statck&#xff09; Java虚拟机栈用于管理Java方法的调用&#xff0c;而本地方法栈用于管理本地方法的调用。 本地方法栈&#xff0c;也是线程私有的。 允许被实现成固定或…

Matlab|基于分布式ADMM算法的考虑碳排放交易的电力系统优化调度研究

目录 1 主要内容 目标函数 计算步骤 节点系统 2 部分代码 3 程序结果 4 下载链接 1 主要内容 程序完全复现文献《A Distributed Dual Consensus ADMM Based on Partition for DC-DOPF with Carbon Emission Trading》&#xff0c;建立了一个考虑碳排放交易的最优模型&am…

【测试开发学习历程】MySQL分组查询与子查询 + MySQL表的联结操作

目录 1 MySQL分组查询与子查询 1.1 数据分组查询 1.2 过滤分组 1.3 分组结果排序 1.4 select语句中子句的执行顺序 1.5 子查询 2 MySQL表的联结操作 2.1 关系表 2.2 表联结 2.3 笛卡尔积 2.4 内部联结 2.5 外联结 2.6 自联结 2.7 组合查询 1 MySQL分组查询与子查询…

Java学习路线一条龙

说在前面 讲真&#xff0c;虽然我是正规计算机专业出身&#xff0c;但十多年来&#xff0c;Java这语言和它那一大堆配套的工具、框架&#xff0c;变化得太快了。 我也是一边学新的&#xff0c;一边扔旧的&#xff0c;忙得不可开交。 现在回想起来&#xff0c;走过的弯路、浪费…

2024年【危险化学品经营单位安全管理人员】新版试题及危险化学品经营单位安全管理人员模拟考试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 危险化学品经营单位安全管理人员新版试题考前必练&#xff01;安全生产模拟考试一点通每个月更新危险化学品经营单位安全管理人员模拟考试题题目及答案&#xff01;多做几遍&#xff0c;其实通过危险化学品经营单位安…

C++默认构造函数(二)

目录 构造函数补充 构造函数初始化列表的使用 赋值运算符重载函数 运算符重载函数介绍 运算符重载函数的使用 赋值运算符重载函数 赋值运算符重载函数的使用 拷贝构造函数和赋值运算符重载函数 重载前置和后置 前置 后置 重载流插入<<与流提取>> 流插…
最新文章