《算法题讲解指南:优选算法-模拟》--41.外观数列,42.数青蛙

《算法题讲解指南:优选算法-模拟》--41.外观数列,42.数青蛙

🔥小叶-duck个人主页

❄️个人专栏《Data-Structure-Learning》

《C++入门到进阶&自我学习过程记录》《算法题讲解指南》--从优选到贪心

未择之路,不须回头
已择之路,纵是荆棘遍野,亦作花海遨游


目录

41.外观数列

题目链接:

题目描述:

题目示例:

解法(模拟):

算法思路:

C++算法代码:

算法总结及流程解析:

42.数青蛙

题目链接:

题目描述:

题目示例:

解法(模拟+分情况讨论):

算法思路:

C++算法代码:

算法总结及流程解析:

结束语


41.外观数列

题目链接:

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

题目描述:

题目示例:

解法(模拟):

算法思路:

      所谓【外观数列】,其中只是依次统计字符串中连续且相同的字符的个数。依据题意,依次模拟即可。

C++算法代码:

class Solution { public: // string func(string s) // { // string ret; // int left = 0, right = 0, len = 0; // while(right < s.size()) // { // if(s[right] == s[left]) // { // right++; // } // else // { // len = right - left; // ret += to_string(len); // ret += s[left]; // left = right; // } // } // len = right - left; // ret += to_string(len); // ret += s[left]; // return ret; // } string countAndSay(int n) { // string ret = "1"; // while(--n) // { // ret = func(ret); // } // return ret; string ret = "1"; while(--n) { string s; //巧妙用一下双指针来获取相同数字的长度 int left = 0, right = 0, len = 0; while(right < ret.size()) { if(ret[right] == ret[left]) { right++; } else { len = right - left; s += to_string(len);//to_string可以将数字转换出字符 s += ret[left]; left = right; } } len = right - left; s += to_string(len); s += ret[left]; ret = s; } return ret; } };

算法总结及流程解析:

42.数青蛙

题目链接:

1419. 数青蛙 - 力扣(LeetCode)

题目描述:

题目示例:

解法(模拟+分情况讨论):

算法思路:

      模拟青蛙的叫声。

  • 当遇到 'r'  'o'  'a'  'k' 这四个字符的时候,我们要去看看每一个字符对应的前驱字符,有没有青蛙叫出来。如果有青蛙叫出来,那么就让这个青蛙接下来喊出这个字符;如果没有,直接返回 -1;
  • 当遇到 ‘c’ 这个字符的时候,我们去看看 ‘k’ 这个字符有没有青蛙叫出来。如果有,就让这个青蛙继续去 ‘c’ 这个字符;如果没有的话,就重新整一个青蛙出来

C++算法代码:

class Solution { public: int minNumberOfFrogs(string croakOfFrogs) { // //暴力算法:模拟 // //通过一个数组hash模拟存放croak这五个字母 // int n = croakOfFrogs.size(); // vector<int> hash(5, 0); // for(int i = 0; i < n; i++) // { // if(croakOfFrogs[i] == 'c') // { // if(hash[4]) // { // hash[4]--; // } // hash[0]++; // } // else if(croakOfFrogs[i] == 'r') // { // if(hash[0]-- == 0) // { // return -1; // } // hash[1]++; // } // else if(croakOfFrogs[i] == 'o') // { // if(hash[1]-- == 0) // { // return -1; // } // hash[2]++; // } // else if(croakOfFrogs[i] == 'a') // { // if(hash[2]-- == 0) // { // return -1; // } // hash[3]++; // } // else // { // if(hash[3]-- == 0) // { // return -1; // } // hash[4]++; // } // } // for(int i = 0; i < hash.size() - 1; i++) // { // if(hash[i] != 0) // { // return -1; // } // } // return hash[4]; //代码优化:使用一个哈希表存放croak在数组hash中对应的下标,便于快速访问 //就可以不用像上面那样用五个if else来分别判断 string s = "croak"; int n = s.size(); vector<int> hash(n, 0);//用数组模拟哈希表hash来存放croak几个字符 unordered_map<char, int> index; //存放字符所对应在数组hash中的下标 for(int i = 0; i < n; i++) { index[s[i]] = i; } for(int i = 0; i < croakOfFrogs.size(); i++) { int x = index[croakOfFrogs[i]]; //获取到当前字符的下标 if(x != 0) //当前字符为r、o、a、k { if(hash[x - 1]-- == 0) { return -1; } hash[x]++; } else//当前字符为c { if(hash[n - 1]) { hash[n - 1]--; } hash[x]++; } } //如果遍历完字符串后数组hash中除了最后一位k有值, //还有其他字符也有值,则说明有传声还没有完成,则返回-1 for(int i = 0; i < n - 1; i++) { if(hash[i] != 0) { return -1; } } return hash[n - 1]; } };

算法总结及流程解析:

结束语

      到此,41.外观数列,42.数青蛙 这两道算法题就讲解完了。外观数列:模拟统计连续相同字符的个数并生成新字符串。通过双指针计数,迭代n-1次得到结果。数青蛙:通过模拟青蛙叫声过程,分析字符序列croak的匹配逻辑。算法使用哈希表记录字符位置,并动态维护各阶段字符计数:当遇到c时复用已完成k的青蛙或新增青蛙;其他字符则需前驱字符存在才能继续。最后检查未完成序列的青蛙数量。希望大家能有所收获!

Read more

数据结构:绪论之时间复杂度与空间复杂度

数据结构:绪论之时间复杂度与空间复杂度

作者主页 失踪人口回归,陆续回三中。 开辟文章新专栏——数据结构,恳请各位大佬批评指正! 文章目录 * 作者主页 * 数据结构的基本知识 * 数据: * 数据元素: * 数据对象: * 数据类型: * 数据结构: * 逻辑结构:元素之间的逻辑关系 * 存储结构:物理结构 * 数据运算 * 算法与其评价 * 算法的概念: * 算法效率的评价: * 时间复杂度 * 空间复杂度 数据结构的基本知识 数据: 数据是信息的载体 数据元素: 数据元素是数据的基本单位,数据项是构成元素不可分割的最小单位。 数据对象: 具有相同性质的数据元素的集合 数据类型: 1. 原子类型 2. 结构类型 3. 抽象数据类型(ADT):描述了数据的逻辑运算和抽象运算,从而构成一个完整的数据结构定义 数据结构: 有一种或多种特定关系的数据元素的集合 逻辑结构:元素之间的逻辑关系 集合:元素同属于一个集合 线性结构:一对一,

By Ne0inhk
【leetcode】手撕排序算法,力扣912题的7大排序算法代码归总(纯代码)

【leetcode】手撕排序算法,力扣912题的7大排序算法代码归总(纯代码)

前言 🌟🌟本期讲解关于力扣的几篇题解的详细介绍~~~ 🌈感兴趣的小伙伴看一看小编主页:GGBondlctrl-ZEEKLOG博客 🔥 你的点赞就是小编不断更新的最大动力                                        🎆那么废话不多说直接开整吧~~   目录 📚️1.超时排序 🚀1.1冒泡排序 编辑 🚀1.2插入排序 🚀1.3选择排序 📚️2.通过排序 🚀2.1希尔排序 🚀2.2堆排序 🚀2.3分治排序 🚀 2.4归并排序 📚️3.总结   ——前言:本期小编主要是代码的展示,对于每个算法在之前就已经讲解过,那么那就展示吧~~ ——分治归并算法讲解:【leetcode】拆解与整合:分治并归的算法逻辑-ZEEKLOG博客  ——基础排序算法讲解:【数据结构】关于冒泡排序,选择排序,插入排序,希尔排序,堆排序你到底了解多少???(超详解)_堆排序、希尔排序、冒泡排序、选择排序-ZEEKLOG博客 📚️1.超时排序

By Ne0inhk
Flutter 三方库 algorithmic 鸿蒙核心通用算网级引擎底座适配手册:解构深层经典算法集簇并全面覆盖高性能内存安全隔离与高标准计算数据结构特征分析-适配鸿蒙 HarmonyOS ohos

Flutter 三方库 algorithmic 鸿蒙核心通用算网级引擎底座适配手册:解构深层经典算法集簇并全面覆盖高性能内存安全隔离与高标准计算数据结构特征分析-适配鸿蒙 HarmonyOS ohos

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 algorithmic 鸿蒙核心通用算网级引擎底座适配手册:解构深层经典算法集簇并全面覆盖高性能内存安全隔离与高标准计算数据结构特征分析网络 前言 在 OpenHarmony 应用的高级逻辑开发中,不仅需要精美的界面,更需要稳健、高效的底层算法支撑。面对如文件树极速排序、动态规划路径优选、或是深度嵌套数据的广度优先搜索等场景,手写算法不仅容易出错,且性能往往无法压榨到极致。algorithmic 库为 Flutter 开发者提供了一套标准的、针对 Dart 优化的核心算法集。本文将调研其在鸿蒙端的集成方案,助力构建“快准稳”的业务底座。 一、原直线性 / 概念介绍 1.1 基础原理/概念介绍 algorithmic 的核心逻辑是基于 针对 Dart VM 设计的高性能算法抽象与缓存优化。它涵盖了排序(Sorting)、搜索(Searching)

By Ne0inhk

快速傅里叶变换 FFT 算法 | 分治策略、蝶形运算与旋转因子

注:本文为 “快速傅里叶变换 FFT 算法 ” 相关合辑。 图片清晰度受引文原图所限。 略作重排,未整理去重。 如有内容异常,请看原文。 彻底搞懂快速傅里叶变换 FFT 思想——分而治之 牙非涯 发布于 2022-02-27 22:44 通过离散傅里叶变换与窗函数,完成了对实际信号的傅里叶变换运算。即便处理时长较短的信号,该运算的计算复杂度仍较高。采用分而治之策略对问题进行分解,可显著降低计算开销。 分而治之是快速傅里叶变换(FFT)的构成基础。FFT 算法首次发表于 1965 年题为 An Algorithm for the Machine Calculation of Complex Fourier Series 的学术论文,由 IBM 研究员 James Cooley 与普林斯顿大学教授

By Ne0inhk