首页 > 编程语言 >【C++算法】42.模拟_数青蛙

【C++算法】42.模拟_数青蛙

时间:2024-12-14 23:30:01浏览次数:4  
标签:字符 hash int 42 青蛙 C++ 计数 croak

文章目录


题目链接:

1419. 数青蛙


题目描述:

1d203a8178705f697fe593a29c72439d


解法

模拟:

利用一个指针,从前往后遍历,遍历到r就看前面有没有c,遍历到o就看前面有没有r。

建立一个哈希表记录每一个字符出现的情况。

851aca914a883d220445c0cff618081e

729f93cf2adb510b082f9acf65ed9689

比如:

  1. 先出现c,哈希表里c的值是1
  2. 出现r后,c的值-1r的值+1
  3. 当完成了c r c o a k r o a k后,再次出现c r o a k就不一样了,因为题目要的是最小青蛙数。
  4. 这个时候,我们让k的值-1c的值+1,代表里面有个青蛙重新开始叫了。
  5. 当结束后,应该只有k里面有值,如果这个时候除了k还有其他元素有值,那么返回-1

C++ 算法代码:

class Solution 
{
    public:
    int minNumberOfFrogs(string croakOfFrogs) 
    {
        string t = "croak"; // 定义一个字符串 t,表示 "croak" 的顺序
        int n = t.size();
        vector<int> hash(n); // 用数组来模拟哈希表 // hash[0] = 'c', hash[1] = 'r', ..., hash[4] = 'k'
        unordered_map<char, int> index; //[x, x这个字符对应的下标]
        for(int i = 0; i < n; i++)
            index[t[i]] = i; // 例如,'c' -> 0, 'r' -> 1, ..., 'k' -> 4

        for(auto ch : croakOfFrogs) // 遍历输入字符串 croakOfFrogs 中的每个字符
        {
            if(ch == 'c') // 如果当前字符是 'c',表示一只青蛙开始叫
            {
                if(hash[n - 1] != 0) hash[n - 1]--; // 检查是否有空闲的青蛙('k' 计数大于 0),如果有,则重用一只青蛙
                hash[0]++; // 增加 'c' 的计数,表示一只新的青蛙开始叫
            }
            else // 如果当前字符不是 'c',则表示一只青蛙正在发出声音
            {
                int i = index[ch]; // 获取当前字符在 "croak" 中的索引
                if(hash[i - 1] == 0) return -1; // 如果前一个字符的计数为 0,则说明当前字符不符合 "croak" 的顺序,返回 -1
                hash[i - 1]--; hash[i]++; // 前一个字符计数减 1,当前字符计数加 1
            }
        }
        for(int i = 0; i < n - 1; i++)
            if(hash[i] != 0) // 检查 "croak" 中每个字符的计数是否都为 0,除了最后一个字符 'k'
                return -1; // 如果有任何一个字符的计数不为 0,则返回 -1
        return hash[n - 1]; // 返回 'k' 的计数,即同时发出 "croak" 声音的最小青蛙数量
    }
};

标签:字符,hash,int,42,青蛙,C++,计数,croak
From: https://blog.csdn.net/hlyd520/article/details/144455727

相关文章

  • CS425FZ Audio & Speech Processing
    CS425FZ(Audio&SpeechProcessing)Assignment1(value20%)Releaseddate:Tuesday26thNovember2024Duedate:Sunday15thDecember2024at23:59Thisisanopen-book,gradedassignment.Pleaseciteallreferencesascommentsinyoursubmissions.You......
  • MATLAB基础应用精讲-【数模应用】基于人工势场算法机器人避障路径规划(附python、C++和
    目录前言算法原理问题引入人工场式法算法思想机器人路径规划分类算法步骤存在的问题数学模型 引力势场斥力势场合力势场全局规划与局部避障系统一、全局路径规划二、局部动态避障优缺点优点:缺点:知识拓展基于A*算法和人工势场法的移动机器人路径规划 1A*......
  • C++面试题总结---操作系统(1)
    Linux中查看进程运行状态的指令、查看内存使用情况的指令、tar解压文件的参数。1.查看进程运行状态的指令:ps命令。“ps-aux|grepPID”,用来查看某PID进程状态2.查看内存使用情况的指令:free命令。“free-m”,命令查看内存使用情况。3.tar解压文件的参数:五个命令中必......
  • 素数筛法C++
    众所周知,素数筛法许多种,今天我来比较时间。都是1e7以内的素数。话不多说,开始比较(有错请指出):1.暴力法:一个一个枚举#include<bits/stdc++.h>usingnamespacestd;boolisPrime(longlongnum){ for(longlongi=2;i<=num;i++){ if(num%i==0){ returnf......
  • (免费源码)计算机毕业设计必学必看 万套实战教程 java、python、php、node.js、c#、APP
    摘要随着社会的发展,社会的方方面面都在利用信息化时代的优势。互联网的优势和普及使得各种系统的开发成为必需。本文以实际运用为开发背景,运用软件工程原理和开发方法,它主要是采SSM技术和mysql数据库来完成对系统的设计。整个开发过程首先对医药销售管理系统进行需求分析......
  • C++基础学习--随记
    博客地址:https://www.cnblogs.com/zylyehuo/参考“C++基础与深度解析”一、预备知识//c++常用工具/usr/bin/time//查看程序用了多少时间(Linux自带)$sleep1$/usr/bin/timesleep1valgrind//分析是否有内存泄漏(软件)cppreference.com//"百科全书"(网站)compile......
  • C++11新特性 - 右值引用 & 移动语义(3)
    在C++11之前,假设有这么一个FileHandler类,实现如下#include<iostream>#include<cstdio>//forFILE*#include<vector>classFileHandler{private:FILE*file;FileHandler(constFileHandler&);FileHandler&operator=(constFi......
  • [C++]纯虚函数与虚函数
    1.什么是虚函数?1.1定义虚函数是用virtual关键字声明的成员函数,允许子类覆盖它,并支持运行时多态。1.2特点1.动态绑定(运行时决定调用函数):虚函数在运行时,根据对象的实际类型,而不是指针或引用的类型,决定调用哪个函数。2.基类实现:虚函数在基类中必须有默认实现(即函数体......
  • [C++]类的继承
    一、什么是继承1.定义:        在C++中,继承是一种机制,允许一个类(派生类)继承另一个类(基类)的成员(数据和函数)。继承使得派生类能够直接访问基类的公有和保护成员,同时也可以对这些成员进行扩展或修改。继承是一种“是一个”的关系,它允许一个类从另一个类继承其属性和方......
  • 2024年12月GESPC++三级真题解析
    一、单选题(每题2分,共30分)题目123456789101112131415答案BDAADBCAADDCDCA1.下列二进制表示的十进制数值分别是()[10000011]原=()[10000011]补=()A.-125,-3B.-3,-125C.-3,-3D.-125,-125【答案】B【考纲知识点】原码和补码的计算及转换【......