0301 leetcode - 1502.判断是否能形成等差数列、 682.棒球比赛、657.机器人能否返回原点
1502.判断是否能形成等差数列
题目
给你一个数字数组 arr 。
如果一个数列中,任意相邻两项的差总等于同一个常数,那么这个数列就称为 等差数列 。
如果可以重新排列数组形成等差数列,请返回 true ;否则,返回 false 。
示例 1:
输入:arr = [3,5,1] 输出:true 解释:对数组重新排序得到 [1,3,5] 或者 [5,3,1] ,任意相邻两项的差分别为 2 或 -2 ,可以形成等差数列。
示例 2:
输入:arr = [1,2,4] 输出:false 解释:无法通过重新排序得到等差数列。
提示:
2 <= arr.length <= 1000-10^6 <= arr[i] <= 10^6
解题思路
只要对数组先进行排序,在比较每个相邻元素对差值是否相等就可以了。但是要注意,使用sort函数数组元素将按照转换为字符串的Unicode位点进行排序。不对。
sort()方法 相关知识点
在JavaScript中,Array.prototype.sort() 方法用于对数组的元素进行排序,并返回排序后的数组。这个方法会改变原数组。以下是sort()函数的基本用法和一些高级用法:
基本用法
array.sort([compareFunction])
array:需要排序的数组。compareFunction(可选):用来指定按某种顺序排列的函数。如果省略,数组元素将按照转换为字符串的各个字符的Unicode位点进行排序。
不带比较函数的用法(重点注意)
如果不传递比较函数,数组元素将按照转换为字符串的Unicode位点进行排序,这可能导致以下非预期的排序结果:
let numbers = [20, 3, 5, 1, 2];
numbers.sort();
console.log(numbers); // 输出可能是 [1, 20, 2, 3, 5]
在上面的例子中,数字被转换成字符串,然后按照字符串的Unicode位点排序,所以20排在2前面。
带比较函数的用法
为了正确地排序数字,你应该提供一个比较函数。比较函数应该接受两个参数,通常称为a和b,并且根据返回值来排序:
- 如果返回值小于
0,那么a会被排列到b前面。 - 如果返回值等于
0,a和b的顺序不变。 - 如果返回值大于
0,b会被排列到a前面。
以下是一个升序排序数字数组的例子:
let numbers = [20, 3, 5, 1, 2];
numbers.sort(function(a, b) {return a - b;
});
console.log(numbers); // 输出 [1, 2, 3, 5, 20]
或者使用ES6的箭头函数:
let numbers = [20, 3, 5, 1, 2];
numbers.sort((a, b) => a - b);
console.log(numbers); // 输出 [1, 2, 3, 5, 20]
高级用法
你可以使用比较函数来根据不同的标准排序对象数组。例如,以下代码根据对象的age属性进行升序排序:
let people = [{ name: "Alice", age: 40 },{ name: "Bob", age: 30 },{ name: "Carol", age: 50 }
];people.sort((a, b) => a.age - b.age);
console.log(people);
注意事项
sort()方法在原数组上进行排序,不创建新数组。- 如果比较函数没有返回值,或者返回的是
NaN,则元素的位置可能会不确定。 - 在旧版浏览器中,
sort()方法的实现可能不是稳定的,这意味着相等的元素可能不会保持它们原始的顺序。然而,从ECMAScript 2019(ES10)开始,所有主流JavaScript引擎的sort()实现都是稳定的。
使用sort()方法时,请确保理解它的行为,并根据需要提供适当的比较函数。
代码实现
/*** @param {number[]} arr* @return {boolean}*/
var canMakeArithmeticProgression = function(arr) {arr.sort((a, b) => a - b); // 按照数值大小进行排序var d=arr[1]-arr[0]for(let i=1;i<arr.length-1;i++){if(arr[i+1]-arr[i]!==d){return false}}return true
};
682.棒球比赛
题目
你现在是一场采用特殊赛制棒球比赛的记录员。这场比赛由若干回合组成,过去几回合的得分可能会影响以后几回合的得分。
比赛开始时,记录是空白的。你会得到一个记录操作的字符串列表 ops,其中 ops[i] 是你需要记录的第 i 项操作,ops 遵循下述规则:
- 整数
x- 表示本回合新获得分数x "+"- 表示本回合新获得的得分是前两次得分的总和。题目数据保证记录此操作时前面总是存在两个有效的分数。"D"- 表示本回合新获得的得分是前一次得分的两倍。题目数据保证记录此操作时前面总是存在一个有效的分数。"C"- 表示前一次得分无效,将其从记录中移除。题目数据保证记录此操作时前面总是存在一个有效的分数。
请你返回记录中所有得分的总和。
示例 1:
输入:ops = ["5","2","C","D","+"] 输出:30 解释: "5" - 记录加 5 ,记录现在是 [5] "2" - 记录加 2 ,记录现在是 [5, 2] "C" - 使前一次得分的记录无效并将其移除,记录现在是 [5]. "D" - 记录加 2 * 5 = 10 ,记录现在是 [5, 10]. "+" - 记录加 5 + 10 = 15 ,记录现在是 [5, 10, 15]. 所有得分的总和 5 + 10 + 15 = 30
示例 2:
输入:ops = ["5","-2","4","C","D","9","+","+"] 输出:27 解释: "5" - 记录加 5 ,记录现在是 [5] "-2" - 记录加 -2 ,记录现在是 [5, -2] "4" - 记录加 4 ,记录现在是 [5, -2, 4] "C" - 使前一次得分的记录无效并将其移除,记录现在是 [5, -2] "D" - 记录加 2 * -2 = -4 ,记录现在是 [5, -2, -4] "9" - 记录加 9 ,记录现在是 [5, -2, -4, 9] "+" - 记录加 -4 + 9 = 5 ,记录现在是 [5, -2, -4, 9, 5] "+" - 记录加 9 + 5 = 14 ,记录现在是 [5, -2, -4, 9, 5, 14] 所有得分的总和 5 + -2 + -4 + 9 + 5 + 14 = 27
示例 3:
输入:ops = ["1"] 输出:1
提示:
1 <= ops.length <= 1000ops[i]为"C"、"D"、"+",或者一个表示整数的字符串。整数范围是[-3 * 104, 3 * 104]- 对于
"+"操作,题目数据保证记录此操作时前面总是存在两个有效的分数 - 对于
"C"和"D"操作,题目数据保证记录此操作时前面总是存在一个有效的分数
解题思路
使用栈去操作。在JavaScript中,数组可以很方便地模拟栈的行为,使用 push() 方法来添加元素到栈顶,使用 pop() 方法来移除栈顶元素。
相关知识点
1.栈(Stack)
栈是一种后进先出(Last In, First Out,LIFO)的数据结构。以下是如何使用数组来模拟栈的操作:
基本操作:
push(element):将元素添加到栈顶。pop():移除栈顶元素,并返回被移除的元素。peek()或top():返回栈顶元素,但不移除它。isEmpty():检查栈是否为空。size():返回栈中的元素数量。
示例代码:
let stack = []; // 使用数组来模拟栈// 入栈
stack.push(1);
stack.push(2);
stack.push(3);// 出栈
console.log(stack.pop()); // 输出 3// 查看栈顶元素
console.log(stack[stack.length - 1]); // 输出 2// 检查栈是否为空
console.log(stack.isEmpty()); // 输出 false// 获取栈的大小
console.log(stack.length); // 输出 2
2.队列(Queue)
队列是一种先进先出(First In, First Out,FIFO)的数据结构。以下是如何使用数组来模拟队列的操作:
基本操作:
enqueue(element):在队列的末尾添加一个新元素。dequeue():移除队列的第一个元素,并返回被移除的元素。front():返回队列的第一个元素,但不移除它。isEmpty():检查队列是否为空。size():返回队列中的元素数量。
示例代码:
let queue = []; // 使用数组来模拟队列// 入队
queue.push(1);
queue.push(2);
queue.push(3);// 出队
console.log(queue.shift()); // 输出 1// 查看队列的第一个元素
console.log(queue[0]); // 输出 2// 检查队列是否为空
console.log(queue.length === 0); // 输出 false// 获取队列的大小
console.log(queue.length); // 输出 2
请注意,虽然使用数组的 push() 和 shift() 方法可以模拟队列,但 shift() 操作的时间复杂度是 O(n),因为它需要移动所有其他元素。在实际应用中,为了提高性能,可以使用 Object 或者 Map 来实现队列,这样入队和出队操作都可以在 O(1) 时间内完成。
在ES6中,还可以使用 class 关键字来创建更正式的栈和队列类,为它们提供更清晰的方法和属性。
总之,栈和队列在js中其实可以合二为一,取最前面的元素就是用shift,最后一个就是pop。
3.reduce函数
reduce 函数是 JavaScript 数组的一个高阶函数,它对数组中的每个元素执行一个由你提供的“reducer”回调函数(升序执行),将其结果汇总为单个返回值。
array.reduce(function(accumulator, currentValue, currentIndex, array) {// ... 执行操作 ...
}, initialValue);
function(accumulator, currentValue, currentIndex, array):对于每个元素执行的回调函数。accumulator:累加器累加回调的返回值; 它是上一次调用回调时返回的值,或者是提供的初始值(见下文)。currentValue:数组中正在处理的当前元素。currentIndex(可选):数组中正在处理的当前元素的索引。如果提供了initialValue,则起始索引为 0,否则为 1。array(可选):调用reduce的数组。
initialValue(可选):作为第一次调用回调函数时的第一个参数的值。如果没有提供初始值,则将使用数组中的第一个元素,并且currentIndex从 1 开始。
以下是一个使用 reduce 来计算数组中所有数字总和的例子:
const numbers = [1, 2, 3, 4, 5];const sum = numbers.reduce((accumulator, currentValue) => {return accumulator + currentValue;
}, 0); // 初始值为 0console.log(sum); // 输出 15
在这个例子中,reduce 函数遍历 numbers 数组,将每个元素加到累加器上,最终返回总和。
如果没有提供 initialValue,reduce 将使用数组的第一个元素作为累加器的初始值,并从第二个元素开始遍历数组。
下面是一个没有提供初始值的例子:
const numbers = [1, 2, 3, 4, 5];const sum = numbers.reduce((accumulator, currentValue) => {return accumulator + currentValue;
});console.log(sum); // 输出 15
在这个例子中,reduce 从数组的第一个元素(1)开始作为累加器的初始值,然后从第二个元素(2)开始遍历数组。
reduce 函数非常强大,可以用于执行各种复杂的操作,比如将数组扁平化、计算对象数组的属性总和、按属性分组对象等。
代码实现
function calPoints(operations) {let stack = []; // 使用数组作为栈operations.forEach(op => {if (op === "C") {// "C" 操作:移除栈顶元素stack.pop();} else if (op === "D") {// "D" 操作:将栈顶元素加倍,并将结果压入栈stack.push(stack[stack.length - 1] * 2);} else if (op === "+") {// "+" 操作:将栈顶的两个元素相加,并将结果压入栈stack.push(stack[stack.length - 1] + stack[stack.length - 2]);} else {// 数字操作:将字符串转换为数字并压入栈stack.push(parseInt(op));}});// 计算栈中所有得分的总和return stack.reduce((sum, score) => sum + score, 0);
}
657.机器人能否返回原点
题目
在二维平面上,有一个机器人从原点 (0, 0) 开始。给出它的移动顺序,判断这个机器人在完成移动后是否在 (0, 0) 处结束。
移动顺序由字符串 moves 表示。字符 move[i] 表示其第 i 次移动。机器人的有效动作有 R(右),L(左),U(上)和 D(下)。
如果机器人在完成所有动作后返回原点,则返回 true。否则,返回 false。
注意:机器人“面朝”的方向无关紧要。 “R” 将始终使机器人向右移动一次,“L” 将始终向左移动等。此外,假设每次移动机器人的移动幅度相同。
示例 1:
输入: moves = "UD" 输出: true 解释:机器人向上移动一次,然后向下移动一次。所有动作都具有相同的幅度,因此它最终回到它开始的原点。因此,我们返回 true。
示例 2:
输入: moves = "LL" 输出: false 解释:机器人向左移动两次。它最终位于原点的左侧,距原点有两次 “移动” 的距离。我们返回 false,因为它在移动结束时没有返回原点。
提示:
1 <= moves.length <= 2 * 104moves只包含字符'U','D','L'和'R'
代码实现
/*** @param {string} moves* @return {boolean}*/
var judgeCircle = function(moves) {var length=moves.length;//如果字符串是奇数,必不可能回到原点。if(length%2===1) return false;//是偶数的时候 只要RL的个数相等和UD个数相等即可。var udCount=0;var rlCount=0;for(let i=0;i<length;i++){if(moves[i]==='U')udCount++;if(moves[i]==='D')udCount--;if(moves[i]==='R')rlCount++;if(moves[i]==='L')rlCount--;}if(udCount===0 && rlCount===0) return true;return false;
};
相关文章:
0301 leetcode - 1502.判断是否能形成等差数列、 682.棒球比赛、657.机器人能否返回原点
1502.判断是否能形成等差数列 题目 给你一个数字数组 arr 。 如果一个数列中,任意相邻两项的差总等于同一个常数,那么这个数列就称为 等差数列 。 如果可以重新排列数组形成等差数列,请返回 true ;否则,返回 false…...
Vulnhub靶机——AI-WEB-1
目录 一、实验环境 1.1 攻击机Kali 1.2 靶机下载 二、站点信息收集 2.1 IP扫描 2.2 端口扫描 2.3 目录扫描 三、漏洞利用 3.1 SQL注入 3.2 文件上传 四、权限提升 4.1 nc反弹连接 4.2 切换用户 一、实验环境 1.1 攻击机Kali 在虚拟机中安装Kali系统并作为攻击机 1.2 靶机下载 (…...
无人系统:未来科技的智能化代表
无人系统(Unmanned Systems)是指在不依赖人类直接干预的情况下,通过自主或远程控制方式完成任务的系统。随着科技的不断进步,特别是在人工智能、机器人学、传感技术、通信技术等领域的突破,无人系统在各行各业中得到了…...
在Docker中部署DataKit最佳实践
本文主要介绍如何在 Docker 中安装 DataKit。 配置和启动 DataKit 容器 登陆观测云平台,点击「集成」 -「DataKit」 - 「Docker」,然后拷贝第二步的启动命令,启动参数按实际情况配置。 拷贝启动命令: sudo docker run \--hostn…...
进程的状态 ─── linux第11课
目录 编辑 补充知识: 1.并行和并发 分时操作系统(Time-Sharing Systems) 实时操作系统(Real-Time Systems) 进程的状态(操作系统层面) 编辑 运行状态 阻塞状态 状态总结: 挂起状态 linux下的进程状态 补充知识: …...
MySQL数据库基本概念
目录 什么是数据库 从软件角度出发 从网络角度出发 MySQL数据库的client端和sever端进程 mysql的client端进程连接sever端进程 mysql配置文件 MySql存储引擎 MySQL的sql语句的分类 数据库 库的操作 创建数据库 不同校验规则对查询的数据的影响 不区分大小写 区…...
什么是 jQuery
一、jQuery 基础入门 (一)什么是 jQuery jQuery 本质上是一个快速、小巧且功能丰富的 JavaScript 库。它将 JavaScript 中常用的功能代码进行了封装,为开发者提供了一套简洁、高效的 API,涵盖了 HTML 文档遍历与操作、事件处理、…...
Redis Desktop Manager(Redis可视化工具)安装及使用详细教程
一、安装包下载 直接从官网下载,官网下载链接地址:Downloads - Redis 二、安装步骤 2.1说明 Redis Desktop Manager是一款简单快速、跨平台的Redis桌面管理工具,也也被称作Redis可视化工具。 支持命令控制台操作,以及常用&…...
[KEIL]单片机技巧 01
1、查看外设寄存器的值 配合对应的芯片开发手册以查看寄存器及其每一位的意义,可以解决90%以上的单纯的片内外设bug,学会如何通过寄存器的值来排外设上的蛊是嵌入式开发从小白到入门的重要一步,一定要善于使用这个工具,而不是外设…...
云原生监控篇——全链路可观测性与AIOps实战
引言:监控即生命线 2023年某全球支付平台因一次未被捕获的数据库连接泄漏,导致每小时损失120万美元。而另一家社交巨头通过实时异常检测系统,在30秒内自动隔离了大规模DDoS攻击。这两个案例揭示了云原生时代的核心生存法则——监控不是可选项…...
C# 13与.NET 9革新及工业开发应用
摘要 微软推出的C# 13与.NET 9以“高效且智能”为导向,具备扩展类型、半自动属性、锁对象优化等十大革新。本文深入剖析新特性于工业级开发的应用场景,包含性能优化策略、AI集成方案以及EF Core实战技巧,为开发者提供从理论到实践的完整指引…...
Linux系统之DHCP网络协议
目录 一、DHCP概述 二、DHCP部署实操 2.1、安装DHCP软件 2.2、拷贝配置文件 2.3、配置文件详解 2.4、重启软件服务 2.5、新开一台服务器,查看dhcp地址获取 一、DHCP概述 DHCP(Dynamic Host Configuration Protocol)是一种应用层网络协…...
【Linux】【网络】不同子网下的客户端和服务器通信其它方式
【Linux】【网络】不同子网下的客户端和服务器通信其它方式 那么,在 NAT 环境下,应该如何让内网设备做为服务器,使内网设备被外部连接? 1 多拨 部分运营商,支持在多个设备上,通过 PPPoE 登录同一个宽带账…...
【C++/数据结构】栈
零.导言 栈是一种数据结构,在后续的学习中可能经常使用,因此我们今天就来学习如何实现栈,以更好地使用它。 一.栈的实现 栈的形式如下: #include<iostream> #include<cassert>using namespace std;typedef int Stack…...
Qt 对象树详解:从原理到运用
1. 什么是对象树? 对象树是一种基于父子关系的对象管理机制。在 Qt 中,所有继承自 QObject 的类都可以参与到对象树中。 当一个对象被设置为另一个对象的父对象时,子对象会被添加到父对象的内部列表中,形成一种树状结构。 Qt 提…...
【软路由】ImmortalWrt 编译指南:从入门到精通
对于喜欢折腾路由器,追求极致性能和定制化的玩家来说,OpenWrt 无疑是一个理想的选择。而在众多 OpenWrt 衍生版本中,ImmortalWrt 以其更活跃的社区、更激进的特性更新和对新硬件的支持而备受关注。 本文将带你深入了解 ImmortalWrt࿰…...
【智能音频新风尚】智能音频眼镜+FPC,打造极致听觉享受!【新立电子】
智能音频眼镜,作为一款将时尚元素与前沿科技精妙融合的智能设备,这种将音频技术与眼镜形态完美结合的可穿戴设备,不仅解放了用户的双手,更为人们提供了一种全新的音频交互体验。新立电子FPC在智能音频眼镜中的应用,为音…...
第2章 windows故障排除(网络安全防御实战--蓝军武器库)
网络安全防御实战--蓝军武器库是2020年出版的,已经过去3年时间了,最近利用闲暇时间,抓紧吸收,总的来说,第2章开始带你入门了,这里给出了几个windows重要的工具,说实话,好多我也是第一…...
深度学习笔记——线性回归的从0开始实现
记录学习到的知识: 语义分割是将标签或类别与图片的每个像素关联的一种深度学习算法。 它用来识别构成可区分类别的像素集合。 图像分割是一个端到端图像分析过程,它将数字图像分成多个片段,并对每个区域中包含的信息进行分类。三种图像分割…...
配置Spring Boot中的Jackson序列化
配置Spring Boot中的Jackson序列化 在开发基于Spring Boot的应用程序时,Jackson是默认的JSON序列化和反序列化工具。它提供了强大的功能,可以灵活地处理JSON数据。然而,Jackson的默认行为可能无法完全满足我们的需求。例如,日期格…...
wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...
Kafka入门-生产者
生产者 生产者发送流程: 延迟时间为0ms时,也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于:异步发送不需要等待结果,同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...
【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)
LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 题目描述解题思路Java代码 题目描述 题目链接:LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...
【SpringBoot自动化部署】
SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一,能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时,需要添加Git仓库地址和凭证,设置构建触发器(如GitHub…...
论文阅读:LLM4Drive: A Survey of Large Language Models for Autonomous Driving
地址:LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻译 自动驾驶技术作为推动交通和城市出行变革的催化剂,正从基于规则的系统向数据驱动策略转变。传统的模块化系统受限于级联模块间的累积误差和缺乏灵活性的预设规则。…...
uniapp 集成腾讯云 IM 富媒体消息(地理位置/文件)
UniApp 集成腾讯云 IM 富媒体消息全攻略(地理位置/文件) 一、功能实现原理 腾讯云 IM 通过 消息扩展机制 支持富媒体类型,核心实现方式: 标准消息类型:直接使用 SDK 内置类型(文件、图片等)自…...
Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合
作者:来自 Elastic Udayasimha Theepireddy (Uday), Brian Bergholm, Marianna Jonsdottir 通过搜索 AI 和云创新推动教育领域的数字化转型。 我们非常高兴地宣布,Elastic 已获得 AWS 教育 ISV 合作伙伴资质。这一重要认证表明,Elastic 作为 …...
