TikTok真题第3天 | 856.括号的分数、2115. 从给定原材料中找到所有可以做出的菜、394.字符串解码

本文主要是介绍TikTok真题第3天 | 856.括号的分数、2115. 从给定原材料中找到所有可以做出的菜、394.字符串解码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

856.括号的分数

题目链接:856.score-of-parentheses

解法:

leetcode官方的题解基本是每个字都认得,连起来就看不懂。

使用栈来解决,后进先出,后面加入的左括号,先弹出和右括号去匹配。定义一个记录分数的栈,假设string前面是空字符串(我不知道为啥这么假设),所以开始就要先压入一个0。

接下来遍历字符,如果是左括号,则压入0,如果是右括号,则弹出栈顶元素score:(1)如果栈顶元素是0,说明前一个是左括号,那么构成 (),则分数为1;(2)如果栈顶元素为1,说明前一个还是右括号,那么构成的是 )),说明是(A)这种类型,那么分数为 2*score。

最后返回栈顶元素。

解法参考:栈

边界条件:无

时间复杂度:O(n)

空间复杂度:O(n)

class Solution {
public:int scoreOfParentheses(string s) {stack<int> scores;scores.push(0);for (char c: s) {if (c=='(') {scores.push(0);} else {int score = scores.top();scores.pop();if (score==0) {scores.top() += 1;} else {scores.top() += 2 * score;}}}return scores.top();}
};

2115. 从给定原材料中找到所有可以做出的菜

题目链接:find-all-possible-recipes-from-given-supplies

解法:

ingredient 指向 recipe,构建有向图,同时记录各recipe的入度。那么ingredient是入度为0的,而recipe的入度不为0。

以supplies(入度为0)初始化队列,遍历整个图,减少recipe的入度。如果recipe的入度已经为0,那么可以做该道菜,加入队列中。这也就是拓扑排序。

迭代结束后,取出入度为0的所有recipe,作为结果。也就是说,图中 indegree=0 的 recipes 即为可以做出的菜。

解法参考:拓扑排序+BFS

拓扑排序的思想:

拓扑排序(Topological Sorting)是图论中的一个概念,用于对有向无环图(Directed Acyclic Graph,简称 DAG)的所有顶点进行排序。这种排序方式满足一个条件:对于图中的每一条有向边 UV(从顶点 U 指向顶点 V),在排序结果中顶点 U 都出现在顶点 V 之前。

拓扑排序的一个典型应用是在任务调度或课程规划中确定任务或课程的执行顺序。在这些应用中,边表示一个任务必须在另一个任务之前完成的关系。

拓扑排序的特点和步骤如下:

  1. 特点

    • 拓扑排序只适用于有向无环图(DAG)。如果图中存在环,那么没有有效的拓扑排序。
    • 对于给定的图,拓扑排序可能不是唯一的。可能存在多个有效的排序顺序。
  2. 步骤

    • 计算入度:首先计算图中每个顶点的入度(指向该顶点的边的数量)。
    • 初始化队列:将所有入度为 0 的顶点放入队列中。
    • 处理队列:当队列非空时,执行以下步骤:
      • 从队列中移除一个顶点。
      • 将该顶点添加到拓扑排序的结果中。
      • 减少所有由该顶点指向的顶点的入度。如果某个顶点的入度变为 0,则将其加入队列。
  3. 结果

    • 最终,队列处理完毕后,如果排序结果中的顶点数量与图中的顶点总数相同,则图是有向无环的,并且得到了一个有效的拓扑排序。
    • 如果排序结果中的顶点数量少于图中的顶点总数,则图中存在环,无法进行有效的拓扑排序。

边界条件:无

class Solution {
public:vector<string> findAllRecipes(vector<string>& recipes, vector<vector<string>>& ingredients, vector<string>& supplies) {unordered_map<string, vector<string>> graph;unordered_map<string, int> indgree;// 构建图,为 原料->菜,同时记录菜的入度for (size_t i=0; i<recipes.size(); i++) {for (const auto& ingred: ingredients[i]) {graph[ingred].push_back(recipes[i]);indgree[recipes[i]] ++;}}// 使用supplies构建队列,用于迭代做菜queue<string> deque;for (string sup: supplies) {deque.push(sup);}// 对supplies进行迭代,并更新入度while (!deque.empty()) {string cur = deque.front();deque.pop();for (const auto& next: graph[cur]) {indgree[next]--;if (indgree[next]==0) deque.push(next);}}// 入度为0的即为可以做的菜vector<string> result;for (string recp: recipes) {if (indgree[recp]==0) result.push_back(recp); }return result;}
};

394.字符串解码

题目链接:394.decode-string

解法:

第一种解法:栈,参考资料:栈题解

需要从内向外生成与拼接字符串,这与栈的先入后出特性对应,所以使用栈。栈里面放的是当前单词(可能有多个letter)前面的单词和数字,以便于在遇到 ] 时弹出来拼接为新单词。其他的看题解吧。

第二种写法是递归,感觉很容易出错,就不管了。

边界条件:无

时间复杂度:O(n)

空间复杂度:O(n)

class Solution {
public:string decodeString(string s) {// string 表示数字前面的字母,int表示[前的数字std::stack<pair<string, int>> stack;string res;int multi = 0;for (char c: s) {// 遇到[,那下一步就是字母了,那么先把前面的字母和数字加入栈中备用if (c == '[') {stack.push({res, multi});res.clear();multi = 0;} else if (c == ']') {auto [last_res, cur_multi] = stack.top();stack.pop();string cur_res;// c++中的实现有点麻烦for (int i=0; i<cur_multi; i++) {cur_res += res;}res = last_res + cur_res;} else if ('0' <= c && c <= '9') {// 数字可能是多位数multi = multi * 10 + (c - '0');} else {// 可能有多个字母res += c;}}return res;}
};

这篇关于TikTok真题第3天 | 856.括号的分数、2115. 从给定原材料中找到所有可以做出的菜、394.字符串解码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/533850

相关文章

Python一次性将指定版本所有包上传PyPI镜像解决方案

《Python一次性将指定版本所有包上传PyPI镜像解决方案》本文主要介绍了一个安全、完整、可离线部署的解决方案,用于一次性准备指定Python版本的所有包,然后导出到内网环境,感兴趣的小伙伴可以跟随... 目录为什么需要这个方案完整解决方案1. 项目目录结构2. 创建智能下载脚本3. 创建包清单生成脚本4

Java实现将HTML文件与字符串转换为图片

《Java实现将HTML文件与字符串转换为图片》在Java开发中,我们经常会遇到将HTML内容转换为图片的需求,本文小编就来和大家详细讲讲如何使用FreeSpire.DocforJava库来实现这一功... 目录前言核心实现:html 转图片完整代码场景 1:转换本地 HTML 文件为图片场景 2:转换 H

C#文件复制异常:"未能找到文件"的解决方案与预防措施

《C#文件复制异常:未能找到文件的解决方案与预防措施》在C#开发中,文件操作是基础中的基础,但有时最基础的File.Copy()方法也会抛出令人困惑的异常,当targetFilePath设置为D:2... 目录一个看似简单的文件操作问题问题重现与错误分析错误代码示例错误信息根本原因分析全面解决方案1. 确保

Java使用正则提取字符串中的内容的详细步骤

《Java使用正则提取字符串中的内容的详细步骤》:本文主要介绍Java中使用正则表达式提取字符串内容的方法,通过Pattern和Matcher类实现,涵盖编译正则、查找匹配、分组捕获、数字与邮箱提... 目录1. 基础流程2. 关键方法说明3. 常见场景示例场景1:提取所有数字场景2:提取邮箱地址4. 高级

Java 中编码与解码的具体实现方法

《Java中编码与解码的具体实现方法》在Java中,字符编码与解码是处理数据的重要组成部分,正确的编码和解码可以确保字符数据在存储、传输、读取时不会出现乱码,本文将详细介绍Java中字符编码与解码的... 目录Java 中编码与解码的实现详解1. 什么是字符编码与解码?1.1 字符编码(Encoding)1

Python 字符串裁切与提取全面且实用的解决方案

《Python字符串裁切与提取全面且实用的解决方案》本文梳理了Python字符串处理方法,涵盖基础切片、split/partition分割、正则匹配及结构化数据解析(如BeautifulSoup、j... 目录python 字符串裁切与提取的完整指南 基础切片方法1. 使用切片操作符[start:end]2

MyBatis的xml中字符串类型判空与非字符串类型判空处理方式(最新整理)

《MyBatis的xml中字符串类型判空与非字符串类型判空处理方式(最新整理)》本文给大家介绍MyBatis的xml中字符串类型判空与非字符串类型判空处理方式,本文给大家介绍的非常详细,对大家的学习或... 目录完整 Hutool 写法版本对比优化为什么status变成Long?为什么 price 没事?怎

MySQL常用字符串函数示例和场景介绍

《MySQL常用字符串函数示例和场景介绍》MySQL提供了丰富的字符串函数帮助我们高效地对字符串进行处理、转换和分析,本文我将全面且深入地介绍MySQL常用的字符串函数,并结合具体示例和场景,帮你熟练... 目录一、字符串函数概述1.1 字符串函数的作用1.2 字符串函数分类二、字符串长度与统计函数2.1

C# $字符串插值的使用

《C#$字符串插值的使用》本文介绍了C#中的字符串插值功能,详细介绍了使用$符号的实现方式,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录$ 字符使用方式创建内插字符串包含不同的数据类型控制内插表达式的格式控制内插表达式的对齐方式内插表达式中使用转义序列内插表达式中使用

详解MySQL中JSON数据类型用法及与传统JSON字符串对比

《详解MySQL中JSON数据类型用法及与传统JSON字符串对比》MySQL从5.7版本开始引入了JSON数据类型,专门用于存储JSON格式的数据,本文将为大家简单介绍一下MySQL中JSON数据类型... 目录前言基本用法jsON数据类型 vs 传统JSON字符串1. 存储方式2. 查询方式对比3. 索引