leetcode 2055.蜡烛之间的盘子(js)

2023-11-09 15:40

本文主要是介绍leetcode 2055.蜡烛之间的盘子(js),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目

给你一个长桌子,桌子上盘子和蜡烛排成一列。给你一个下标从 0 开始的字符串 s ,它只包含字符 ‘*’ 和 ‘|’ ,其中 ‘*’ 表示一个 盘子 ,’|’ 表示一支 蜡烛

同时给你一个下标从 0 开始的二维整数数组 queries ,其中 queries[i] = [lefti, righti] 表示子字符串 s[lefti…righti] (包含左右端点的字符)。对于每个查询,你需要找到 子字符串中两支蜡烛之间 的盘子的 数目 。如果一个盘子在 子字符串中 左边和右边 至少有一支蜡烛,那么这个盘子满足在 两支蜡烛之间

比方说,s = “||*||*|*” ,查询 [3, 8] ,表示的是子字符串 “*||**|” 。子字符串中在两支蜡烛之间的盘子数目为 2 ,子字符串中右边两个盘子在它们左边和右边 至少有一支蜡烛。
请你返回一个整数数组 answer ,其中 answer[i] 是第 i 个查询的答案。

示例 1:

在这里插入图片描述

输入:s = "**|**|***|", queries = [[2,5],[5,9]]
输出:[2,3]
解释:queries[0] 有两个盘子在蜡烛之间。queries[1] 有三个盘子在蜡烛之间。

示例 2:

在这里插入图片描述

输入:s = "***|**|*****|**||**|*", queries = [[1,17],[4,5],[14,17],[5,11],[15,16]]
输出:[9,0,0,0,0]
解释:queries[0] 有 9 个盘子在蜡烛之间。另一个查询没有盘子在蜡烛之间。

提示:

3 <= s.length <= 105
s 只包含字符 '*' 和 '|' 。
1 <= queries.length <= 105
queries[i].length == 2
0 <= lefti <= righti < s.length

解题

1.博主垃圾代码(超时)

本来想的是两个循环,第一个循环queries数组,拿到要截取的那段字符,第二个循环再算盘子的数量。

第二个盘子循环的算法是:遇到了第一个蜡烛,开关就打开,然后开始记盘子数目,每次遇到 ‘|’ 并且前面一个是 ‘*’ 就赋值一次总数sum。

能完成题目要求,但是超时,改了很久看了答案才知道,原来只用一次循环就可以解决,下面是我的代码,双循环实现,但是超时。

var platesBetweenCandles = function (s, queries) {let ans = new Array(queries.length)for (let i = 0; i < queries.length; i++) {let plate = 0;let candle = 0;if (s[queries[i][0]] == '|') {candle = 1;}for (let j = queries[i][0]; j <= queries[i][1]; j++) {if (s[j] == '|' && s[j - 1] != '|') {candle = 1;sum = plate;} else if (candle && s[j] != '|') {plate++;}}ans[i] = sum;;}return ans;};
2.官方预处理前缀和方法
var platesBetweenCandles = function(s, queries) {const n = s.length;const preSum = new Array(n).fill(0);for (let i = 0, sum = 0; i < n; i++) {if (s[i] === '*') {sum++;}preSum[i] = sum;}const left = new Array(n).fill(0);;for (let i = 0, l = -1; i < n; i++) {if (s[i] === '|') {l = i;}left[i] = l;}const right = new Array(n).fill(0);;for (let i = n - 1, r = -1; i >= 0; i--) {if (s[i] === '|') {r = i;}right[i] = r;}const ans = new Array(queries.length).fill(0);for (let i = 0; i < queries.length; i++) {const query = queries[i];const x = right[query[0]], y = left[query[1]];ans[i] = x === -1 || y === -1 || x >= y ? 0 : preSum[y] - preSum[x];}return ans;
};

一共三个数组:

1.preSum 这个数组遍历了原字符串,数组中每个元素的值是之前所有索引的盘子数,例如preSum[10]就是第十个字符之前所有的盘子数。

2.left 这个数组的值是索引值向左数,最近的蜡烛的索引值。有点绕,相当于 || 一共10个字符,left[5]、left[7]…left[8]的值都是4 ,因为向左数第5个字符是最近的蜡烛。

3right 这个数组和left数组相似,得到索引值向右看,最近的蜡烛的索引值。

然后范围[x,y],y左边最近的蜡烛的索引值-x右边最近的蜡烛的索引值就是范围内所有蜡烛之间的盘子。

x === -1 || y === -1 || x >= y ? 0 : preSum[y] - preSum[x]

条件运算符中的判断分别为:范围内只有一个蜡烛和范围内没有蜡烛的情况。范围内没有蜡烛则x>y。

这篇关于leetcode 2055.蜡烛之间的盘子(js)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

JS+HTML实现在线图片水印添加工具

《JS+HTML实现在线图片水印添加工具》在社交媒体和内容创作日益频繁的今天,如何保护原创内容、展示品牌身份成了一个不得不面对的问题,本文将实现一个完全基于HTML+CSS构建的现代化图片水印在线工具... 目录概述功能亮点使用方法技术解析延伸思考运行效果项目源码下载总结概述在社交媒体和内容创作日益频繁的

Node.js 数据库 CRUD 项目示例详解(完美解决方案)

《Node.js数据库CRUD项目示例详解(完美解决方案)》:本文主要介绍Node.js数据库CRUD项目示例详解(完美解决方案),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考... 目录项目结构1. 初始化项目2. 配置数据库连接 (config/db.js)3. 创建模型 (models/

使用Node.js制作图片上传服务的详细教程

《使用Node.js制作图片上传服务的详细教程》在现代Web应用开发中,图片上传是一项常见且重要的功能,借助Node.js强大的生态系统,我们可以轻松搭建高效的图片上传服务,本文将深入探讨如何使用No... 目录准备工作搭建 Express 服务器配置 multer 进行图片上传处理图片上传请求完整代码示例

Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码

《Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码》:本文主要介绍Java中日期时间转换的多种方法,包括将Date转换为LocalD... 目录一、Date转LocalDateTime二、Date转LocalDate三、LocalDateTim

golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法

《golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法》:本文主要介绍golang获取当前时间、时间戳和时间字符串及它们之间的相互转换,本文通过实例代码给大家介绍的非常详细,感兴趣... 目录1、获取当前时间2、获取当前时间戳3、获取当前时间的字符串格式4、它们之间的相互转化上篇文章给大家介

用js控制视频播放进度基本示例代码

《用js控制视频播放进度基本示例代码》写前端的时候,很多的时候是需要支持要网页视频播放的功能,下面这篇文章主要给大家介绍了关于用js控制视频播放进度的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言html部分:JavaScript部分:注意:总结前言在javascript中控制视频播放

Vue中组件之间传值的六种方式(完整版)

《Vue中组件之间传值的六种方式(完整版)》组件是vue.js最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用,针对不同的使用场景,如何选择行之有效的通信方式... 目录前言方法一、props/$emit1.父组件向子组件传值2.子组件向父组件传值(通过事件形式)方

Python实现PDF与多种图片格式之间互转(PNG, JPG, BMP, EMF, SVG)

《Python实现PDF与多种图片格式之间互转(PNG,JPG,BMP,EMF,SVG)》PDF和图片是我们日常生活和工作中常用的文件格式,有时候,我们可能需要将PDF和图片进行格式互转来满足... 目录一、介绍二、安装python库三、Python实现多种图片格式转PDF1、单张图片转换为PDF2、多张图

Java对象和JSON字符串之间的转换方法(全网最清晰)

《Java对象和JSON字符串之间的转换方法(全网最清晰)》:本文主要介绍如何在Java中使用Jackson库将对象转换为JSON字符串,并提供了一个简单的工具类示例,该工具类支持基本的转换功能,... 目录前言1. 引入 Jackson 依赖2. 创建 jsON 工具类3. 使用示例转换 Java 对象为

Node.js net模块的使用示例

《Node.jsnet模块的使用示例》本文主要介绍了Node.jsnet模块的使用示例,net模块支持TCP通信,处理TCP连接和数据传输,具有一定的参考价值,感兴趣的可以了解一下... 目录简介引入 net 模块核心概念TCP (传输控制协议)Socket服务器TCP 服务器创建基本服务器服务器配置选项服