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纯前端实现浏览器语音播报、朗读功能的完整代码

《JS纯前端实现浏览器语音播报、朗读功能的完整代码》在现代互联网的发展中,语音技术正逐渐成为改变用户体验的重要一环,下面:本文主要介绍JS纯前端实现浏览器语音播报、朗读功能的相关资料,文中通过代码... 目录一、朗读单条文本:① 语音自选参数,按钮控制语音:② 效果图:二、朗读多条文本:① 语音有默认值:②

在Node.js中使用.env文件管理环境变量的全过程

《在Node.js中使用.env文件管理环境变量的全过程》Node.js应用程序通常依赖于环境变量来管理敏感信息或配置设置,.env文件已经成为一种流行的本地管理这些变量的方法,本文将探讨.env文件... 目录引言为什么使php用 .env 文件 ?如何在 Node.js 中使用 .env 文件最佳实践引

使用Node.js和PostgreSQL构建数据库应用

《使用Node.js和PostgreSQL构建数据库应用》PostgreSQL是一个功能强大的开源关系型数据库,而Node.js是构建高效网络应用的理想平台,结合这两个技术,我们可以创建出色的数据驱动... 目录初始化项目与安装依赖建立数据库连接执行CRUD操作查询数据插入数据更新数据删除数据完整示例与最佳

Three.js构建一个 3D 商品展示空间完整实战项目

《Three.js构建一个3D商品展示空间完整实战项目》Three.js是一个强大的JavaScript库,专用于在Web浏览器中创建3D图形,:本文主要介绍Three.js构建一个3D商品展... 目录引言项目核心技术1. 项目架构与资源组织2. 多模型切换、交互热点绑定3. 移动端适配与帧率优化4. 可

Java中数组与栈和堆之间的关系说明

《Java中数组与栈和堆之间的关系说明》文章讲解了Java数组的初始化方式、内存存储机制、引用传递特性及遍历、排序、拷贝技巧,强调引用数据类型方法调用时形参可能修改实参,但需注意引用指向单一对象的特性... 目录Java中数组与栈和堆的关系遍历数组接下来是一些编程小技巧总结Java中数组与栈和堆的关系关于

在Java中实现线程之间的数据共享的几种方式总结

《在Java中实现线程之间的数据共享的几种方式总结》在Java中实现线程间数据共享是并发编程的核心需求,但需要谨慎处理同步问题以避免竞态条件,本文通过代码示例给大家介绍了几种主要实现方式及其最佳实践,... 目录1. 共享变量与同步机制2. 轻量级通信机制3. 线程安全容器4. 线程局部变量(ThreadL

Javaee多线程之进程和线程之间的区别和联系(最新整理)

《Javaee多线程之进程和线程之间的区别和联系(最新整理)》进程是资源分配单位,线程是调度执行单位,共享资源更高效,创建线程五种方式:继承Thread、Runnable接口、匿名类、lambda,r... 目录进程和线程进程线程进程和线程的区别创建线程的五种写法继承Thread,重写run实现Runnab

C# 比较两个list 之间元素差异的常用方法

《C#比较两个list之间元素差异的常用方法》:本文主要介绍C#比较两个list之间元素差异,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. 使用Except方法2. 使用Except的逆操作3. 使用LINQ的Join,GroupJoin

深度解析Java项目中包和包之间的联系

《深度解析Java项目中包和包之间的联系》文章浏览阅读850次,点赞13次,收藏8次。本文详细介绍了Java分层架构中的几个关键包:DTO、Controller、Service和Mapper。_jav... 目录前言一、各大包1.DTO1.1、DTO的核心用途1.2. DTO与实体类(Entity)的区别1

java Long 与long之间的转换流程

《javaLong与long之间的转换流程》Long类提供了一些方法,用于在long和其他数据类型(如String)之间进行转换,本文将详细介绍如何在Java中实现Long和long之间的转换,感... 目录概述流程步骤1:将long转换为Long对象步骤2:将Longhttp://www.cppcns.c