蓝桥:前端开发笔面必刷题——Day2 数组(三)
文章目录
- 📋前言
- 🎯两数之和 II
- 📚题目内容
- ✅解答
- 🎯移除元素
- 📚题目内容
- ✅解答
- 🎯有序数组的平方
- 📚题目内容
- ✅解答
- 🎯三数之和
- 📚题目内容
- ✅解答
- 📝最后

📋前言
这个系列的文章收纳的内容是来自于蓝桥云课的前端岗位笔面必刷题的内容,简介是:30天133题,本题单题目全部来自于近2年BAT等大厂前端笔面真题!因为部分题目是需要会员,所以该系列的文章内容并非完全全面(如果需要会员的题目,则从 leetcode 补充对应的题目,题目大概也是一样的考法)。文章中题目涉及的内容包括原题、答案和解析等等。

🎯两数之和 II
📚题目内容
给你一个下标从 1 开始的整数数组 numbers ,该数组已按非递减顺序排列,请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] ,则 1 <= index1 < index2 <= numbers.length。
以长度为 2 的整数数组 [index1, index2] 的形式返回这两个整数的下标 index1 和 index2。
你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。
你所设计的解决方案必须只使用常量级的额外空间。
输入:numbers = [2,7,11,15], target = 9
输出:[1,2]
解释:2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。返回 [1, 2]。
输入:numbers = [2,3,4], target = 6
输出:[1,3]
解释:2 与 4 之和等于目标数 6 。因此 index1 = 1, index2 = 3 。返回 [1, 3]。
输入:numbers = [-1,0], target = -1
输出:[1,2]
解释:-1 与 0 之和等于目标数 -1 。因此 index1 = 1, index2 = 2 。返回 [1, 2]。
题目给的测试用例里有以下限制:
2 <= numbers.length <= 4。-1 <= numbers[i] <= 15。numbers按非递减顺序排列。-1 <= target <= 17。- 仅存在一个有效答案。
✅解答
初始提供代码
function twoSum2(nums, target) {// 补充代码
}
答案
这题跟两数之和的题目还是差不多的思路的,但是要注意这题的要求和限制条件。我们可以在两数之和那一题的基础上继续修改,注意看题目说到的 “下标从 1 开始” ,因此我们在返回下标地址的时候要留意。代码如下。
function twoSum2(nums, target) {for(let i=0;i<nums.length;i++){for(let j=i+1;j<nums.length;j++){if(nums[i]+nums[j]===target){return [i+1,j+1]}}}
}
这个解法实现了暴力枚举法来解决数组两数之和的问题,时间复杂度为 O(n^2)。具体来说,它双重循环遍历数组,将每一对不同的元素相加,判断它们的和是否等于目标数 target,如果相等,则找到了答案,返回两个元素的下标即可。虽然暴力枚举法思路简单,但时间复杂度较高,因此我们可以用双指针的方法来解这一题。
另一种解法
function twoSum2(numbers, target) {let left = 0, right = numbers.length - 1;while (left < right) {const sum = numbers[left] + numbers[right];if (sum < target) {left++;} else if (sum > target) {right--;} else {return [left + 1, right + 1]; }}
}
因为数组已按照非递减顺序排列,所以可以考虑使用双指针分别从数组的两端开始向中间移动,每次比较两个指针所指的元素之和与目标数 target 的大小关系,如果和小于 target,则左指针右移,使得和增大;如果和大于 target,则右指针左移,使得和减小;如果和等于 target,则找到了答案,返回两个指针的下标即可。
具体的实现细节如下:
- 定义左指针
left和右指针right,初始时分别指向数组的第一个元素和最后一个元素; - 当
left < right时,若numbers[left] + numbers[right] < target,则将left++(因为数组已按照非递减顺序排列,所以左指针右移可以使得和增大);若numbers[left] + numbers[right] > target,则将right--(同样理由,右指针左移可以使得和减小);若numbers[left] + numbers[right] == target,则找到了答案,返回[left, right]。
该函数的时间复杂度为 O(n) ,其中 n 是数组的长度,因为在最坏情况下需要遍历整个数组一次。空间复杂度为 O(1),这个解法优于第一种暴力枚举的解法,只不过算法题练习,能解开,有思路都是可以的。
🎯移除元素
📚题目内容
给你一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并原地修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
输入:nums = [3,2,2,3], val = 3
输出:2, nums = [2,2]
解释:函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。例如,函数返回的新长度为 2 ,而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也会被视作正确答案。
输入:nums = [0,0,1,1,1,2,2,3,3,4]
输出:5, nums = [0,1,2,3,4]
解释:函数应该返回新的长度 5 , 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。
题目给的测试用例里有以下限制:
1 <= nums.length <= 8。0 <= nums[i] <= 4。1 <= val <= 3。
✅解答
初始提供代码
function removeElement(nums, val) {// 补充代码
}
答案
function removeElement(nums, val) {let j = 0;for (let i = 0; i < nums.length; i++) {if (nums[i] !== val) {nums[j] = nums[i];j++;}}return j;
}
这一题可以使用双指针来解决。首先定义两个指针 i 和 j,初始时都指向数组的第一个元素。然后遍历整个数组,如果当前元素不等于要移除的元素,则将其放到数组前面,即将 nums[j] = nums[i],并同时将 j 右移一位,表示下一个非要移除的元素需要存放的位置。遍历完成后,j 的值就是新数组的长度,因为 0 到 j - 1 就是新数组中的元素,而 j 到最后都是多余的。最后,返回 j 即可。
该函数的时间复杂度为 O(n),其中 n 是数组的长度。遍历一次数组,时间复杂度是 O(n)。空间复杂度为 O(1)。只使用了常数个变量,符合题目的要求。
接下来两题要会员了,所以题目源自 leetcode(题目考法基本是一样的)
🎯有序数组的平方
📚题目内容
给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
示例一:
输入:nums = [-4,-1,0,3,10]
输出:[0,1,9,16,100]
解释:平方后,数组变为 [16,1,0,9,100]
排序后,数组变为 [0,1,9,16,100]
示例二:
输入:nums = [-7,-3,2,3,11]
输出:[4,9,9,49,121]
提示与限制:
1 <= nums.length <= 104。-104 <= nums[i] <= 104。nums已按 非递减顺序 排序。
进阶:
请你设计时间复杂度为 O(n) 的算法解决本问题
✅解答
初始提供代码
var sortedSquares = function(nums) {};
答案
var sortedSquares = function(nums) {let n = nums.length;let res = new Array(n);let left = 0, right = n - 1; // 双指针,分别指向数组左右两端for (let i = n - 1; i >= 0; i--) { // 从后往前遍历if (Math.abs(nums[left]) > Math.abs(nums[right])) { // 左指针指向的元素平方大res[i] = nums[left] * nums[left];left++;} else { // 右指针指向的元素平方大res[i] = nums[right] * nums[right];right--;}}return res;
};

这道题可以用双指针来解,首先定义数组 res,存放最终结果。然后定义两个指针 left 和 right,分别指向数组的左端和右端。从后往前遍历数组,每次比较左指针指向的元素平方值和右指针指向的元素平方值的大小,将较大的值放入结果数组的末尾,并将对应的指针移动到下一个位置。直到遍历完整个数组,返回结果数组即可。
这样做的原因是因为,当数组中的元素都为正数时,平方后元素值会变大;当数组中的元素都为负数时,平方后元素值仍然变大,但是由于数组是按非递减顺序排好序的,因此无需再做一次排序操作。
该函数的时间复杂度是 O(n),其中 n 是数组的长度,符合题目要求。
🎯三数之和
📚题目内容
给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。
示例一:
输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
解释:
nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0 。
nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 。
nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0 。
不同的三元组是 [-1,0,1] 和 [-1,-1,2] 。
注意,输出的顺序和三元组的顺序并不重要。
示例二:
输入:nums = [0,1,1]
输出:[]
解释:唯一可能的三元组和不为 0 。
示例三:
输入:nums = [0,0,0]
输出:[[0,0,0]]
解释:唯一可能的三元组和为 0 。
提示与限制:
3 <= nums.length <= 3000。-105 <= nums[i] <= 105。
✅解答
初始提供代码
var threeSum = function(nums) {};
答案
var threeSum = function(nums) {let res = [];nums.sort((a, b) => a - b); // 先对数组进行排序,方便去重和缩小搜索范围let n = nums.length;for (let i = 0; i < n; i++) {if (nums[i] > 0) { // 如果当前值大于0,则三数之和一定大于0break;}if (i > 0 && nums[i] === nums[i-1]) { // 去重,如果当前值与前一个值相同,则直接跳过continue;}let left = i + 1, right = n - 1; // 定义双指针,分别指向当前值的下一个数和数组的右端while (left < right) { // 左右指针向中间靠近let sum = nums[i] + nums[left] + nums[right]; // 计算当前三数之和if (sum === 0) { // 如果满足条件,将结果放入结果集中res.push([nums[i], nums[left], nums[right]]);while (left < right && nums[left] === nums[left+1]) { // 去重,如果左指针指向的元素与下一个元素相同,则向右移动指针left++;}while (left < right && nums[right] === nums[right-1]) { // 去重,如果右指针指向的元素与前一个元素相同,则向左移动指针right--;}left++;right--;} else if (sum < 0) { // 如果三数之和小于0,则将左指针向右移动一位left++;} else { // 如果三数之和大于0,则将右指针向左移动一位right--;}}}return res;
};
这题思路是先对数组进行排序,然后将三数之和为 0 的组合找出来。外层循环遍历数组中的每一个数,内层循环使用双指针来找出与当前数相加为 0 的另外两个数。找到之后将符合条件的组合放入结果集中。由于数组已经排序并且去重,因此双指针搜索的范围会越来越小,时间复杂度为 O(n^2)。
需要注意的是,在查找三数之和为 0 的时候,可以直接判断当前值是否大于 0,如果是,则说明后面的数不可能组成三数之和为 0,因此直接退出循环即可。同时,如果当前值与前一个值相同,也可以直接跳过,避免重复计算。
leetcode 示例代码
/*** @param {number[]} nums* @return {number[][]}*/
var threeSum = function(nums) {let res = [];if(nums.length < 3){return res}if(nums.length === 3){if(nums[0] + nums[1] + nums[2] === 0) {res.push([nums[0],nums[1],nums[2]])return res}else{return res}}nums.sort((a, b) => a - b);const len = nums.length;for(let i = 0;i < nums.length;i++){if(nums[i] > 0) break;if(i > 0 && nums[i] == nums[i-1]) continue;let L = i + 1;let R = len - 1;while(L < R) {const sum = nums[i] + nums[L] + nums[R];if(sum == 0){res.push([nums[i],nums[L],nums[R]]);while (L < R && nums[L] === nums[L+1]) L++; while (L < R && nums[R] === nums[R-1]) R--; L++;R--;}else if (sum < 0) L++;else if (sum > 0) R--;}}return res
};

📝最后
感谢阅读到这,这就是 Day3 的全部内容了,这个系列暂时离开一会,因为蓝桥云课接下来的题目都是要会员才能看,因此后续内容将转战到 leetcode 的题目发布为标准,那么这三天的数组内容也先告一段落了。文章内容中题目的答案都是通过检测的了,如果有疑问和争议的内容,可以评论区留言和私信我,收到消息第一时间解答和回复。

相关文章:
蓝桥:前端开发笔面必刷题——Day2 数组(三)
文章目录 📋前言🎯两数之和 II📚题目内容✅解答 🎯移除元素📚题目内容✅解答 🎯有序数组的平方📚题目内容✅解答 🎯三数之和📚题目内容✅解答 📝最后 &#x…...
人工智能专栏第四讲——人工智能的未来展望与机遇
目录 一、人工智能的未来展望 二、人工智能在各领域的应用 三、人工智能的机遇 四、总结...
Unity阴影(Shadow)、Shadowmap
Unity阴影(Shadow) 在Unity中,阴影(Shadow)是用于模拟场景中物体之间相互遮挡和光照效果的特性。阴影可以增加场景的真实感,并在视觉上提供深度和空间感。 Unity提供了几种阴影投射和接收的方法和技术&am…...
编程语言的四种错误处理方法,你知道几种?
错误处理是编程的一个基本要素。除非你写的是“hello world”,否则就必须处理代码中的错误。在本文中,我将讨论各种编程语言在处理错误时使用的最常见的四种方法,并分析它们的优缺点。 关注不同设计方案的语法、代码可读性、演变过程、运行效…...
ContOS7单机安装Hadoop
安装Hadoop 1,准备环节 因为Hadoop是由java编写的,所以需要Java的环境支持,作为开发者我们需要安装jdk。 安装jdk的教程http://t.csdn.cn/6qJKg 下载Hadoop的安装包 Hadoop官网:http://hadoop.apache.org/ Hadoop版本下载地…...
抓取动态网页的数据的具体操作方法
抓取动态网页的数据的具体操作方法 动态网页是指在用户交互过程中,网页内容不断更新和变化的网页。抓取动态网页的数据需要了解以下具体操作方法: 使用浏览器开发者工具:在浏览器中打开目标网页后,按下F12键,打开开发…...
Windows 和 Linux 环境下 ProtoBuf 的安装
文章目录 一、ProtoBuf 在 Windows 环境中的安装二、ProtoBuf 在 Linux 环境中的安装 ProtoBuf在GitHub上的下载地址 一、ProtoBuf 在 Windows 环境中的安装 首先选择自己要下载的版本,我选择的是v21.11: 点进去在最下面选择Windows的版本࿰…...
商用密码应用安全性测评方案编制流程
密评方案编制的目标是完成测评准备活动中获取的信息系统相关资料整理,为现场测评活动提供最基本的文档和指导方案。 按照《GM-T 0116-2021 信息系统密码应用测评过程指南》标准,密评方案编制包括5项关键任务,简要汇总如下表。 编号任务输入文…...
Elasticsearch 集群部署插件管理及副本分片概念介绍
Elasticsearch 集群配置版本均为8以上 安装前准备 CPU 2C 内存4G或更多 操作系统: Ubuntu20.04,Ubuntu18.04,Rocky8.X,Centos 7.X 操作系统盘50G 主机名设置规则为nodeX.qingtong.org 生产环境建议准备单独的数据磁盘主机名 #各自服务器配置自己的主机名 hostnamectl set-ho…...
Liunx 套接字编程(2)TCP接口通信程序
1.TCP通信程序的编写 面向连接、可靠传输、提供字节流传输服务 客户端向服务器发送一个连接建立的请求流程,上图中服务端第三步详细流程 2.TCP接口 socket--创建套接字 int socket(int domain, int type, int protocol); bind---绑定 intbind(int sockfd, struct s…...
8年开发经验,浅谈 API 管理
随着信息化飞速增长的还有各信息系统中的应用接口(API),API作为信息系统内部及不同信息系统之间进行数据传输的渠道,其数量随着软件系统的不断庞大而呈指数型增长,如何管理这些API已经在业界变得越来越重要,…...
【软考备战·四月模考】希赛网四月模考软件设计师上午题
文章目录 一、成绩报告二、错题总结第一题第二题第三题第四题第五题第六题第七题第八题第九题第十题第十一题第十二题第十三题第十四题第十五题第十六题第十七题第十八题第十九题第二十题第二十一题第二十二题 三、知识查缺 题目及解析来源:2023上半年软考-模考大赛…...
MySQL中的@i:=@i+1用法详解
在MySQL中,i:i1是一个非常有用的表达式,用于在查询中生成一个递增的序列号。它可以帮助我们对结果进行编号,或者在需要连续的数字序列时提供便利。 我们先来了解一下MySQL中的用户变量。用户变量是一个用户定义的变量,其以开头。…...
web安全第一天 ,域名,dns
第一天 什么是域名?域名就是网络地址 在hhtp之后的就是域名 域名在哪里注册呢 国内注册商有很多,在网络上搜索一下阿里云万网就可以注册 什么是二级域名和多级域名 域名通常都是www.开头 ,而www.被称为顶级域名,在搜索的时候…...
【Linux】Linux编辑神器vim的使用
目录 一、Vim的基本概念 二、Vim的基本操作 1、进入vim 2、正常模式切换至插入模式 3、插入模式切换至正常模式 4、正常模式切换至底行模式 5、退出Vim编辑器 三、Vim正常模式命令集 1、移动光标 2、删除文字 3、复制 4、替换 5、撤销 四、Vim底行模式命令集 1、列出行号 2、光…...
vulnhub渗透测试靶场练习1
靶场介绍 靶场名:Medium_socialnetwork 下载地址:https://www.vulnhub.com/entry/boredhackerblog-social-network,454/ 环境搭建 靶机建议选择VM VirtualBox,我一开始尝试使用VMware时会报错,所以改用VM VirtualBox,攻击机使用…...
Uart,RS232,RS485串口通讯协议学习
目录 定义 UART(通常被称为串口,简单意味着使用广泛,具有普适性) RS232 RS232电平转换 RS485 -Recommended Standard (再推荐标准) 485和232的对比 RS485组网 总结 定义 串口是我们都很熟悉的,尤其是需要串口调试的时候,打印信息插…...
UML中的assembly关系
UML中的assembly关系 1.什么是Assembly关系 在UML(统一建模语言)中,"assembly"(组装)是一种表示组件之间关系的关联关系。组件是系统中可替换和独立的模块,可以通过组装来构建更大的系统。 当一…...
[Python]缓存cachetools与TTLCache简介
文章目录 cachetools缓存策略缓存操作 TTLCache cachetools是一个Python第三方库,提供了多种缓存算法的实现。 cachetools 使用前需要先安装pip install cachetools,说明文档参见https://cachetools.readthedocs.io/en/latest/。 cachetools提供了五种…...
现在的00后,真是卷死了呀,辞职信已经写好了·····
都说00后躺平了,但是有一说一,该卷的还是卷。这不,三月份春招我们公司来了个00后,工作没两年,跳槽到我们公司起薪23K,都快接近我了。 后来才知道人家是个卷王,从早干到晚就差搬张床到工位睡觉了…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...
Vue 模板语句的数据来源
🧩 Vue 模板语句的数据来源:全方位解析 Vue 模板(<template> 部分)中的表达式、指令绑定(如 v-bind, v-on)和插值({{ }})都在一个特定的作用域内求值。这个作用域由当前 组件…...
ubuntu系统文件误删(/lib/x86_64-linux-gnu/libc.so.6)修复方案 [成功解决]
报错信息:libc.so.6: cannot open shared object file: No such file or directory: #ls, ln, sudo...命令都不能用 error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory重启后报错信息&…...
pgsql:还原数据库后出现重复序列导致“more than one owned sequence found“报错问题的解决
问题: pgsql数据库通过备份数据库文件进行还原时,如果表中有自增序列,还原后可能会出现重复的序列,此时若向表中插入新行时会出现“more than one owned sequence found”的报错提示。 点击菜单“其它”-》“序列”,…...
精益数据分析(98/126):电商转化率优化与网站性能的底层逻辑
精益数据分析(98/126):电商转化率优化与网站性能的底层逻辑 在电子商务领域,转化率与网站性能是决定商业成败的核心指标。今天,我们将深入解析不同类型电商平台的转化率基准,探讨页面加载速度对用户行为的…...
Linux入门(十五)安装java安装tomcat安装dotnet安装mysql
安装java yum install java-17-openjdk-devel查找安装地址 update-alternatives --config java设置环境变量 vi /etc/profile #在文档后面追加 JAVA_HOME"通过查找安装地址命令显示的路径" #注意一定要加$PATH不然路径就只剩下新加的路径了,系统很多命…...
新版NANO下载烧录过程
一、序言 搭建 Jetson 系列产品烧录系统的环境需要在电脑主机上安装 Ubuntu 系统。此处使用 18.04 LTS。 二、环境搭建 1、安装库 $ sudo apt-get install qemu-user-static$ sudo apt-get install python 搭建环境的过程需要这个应用库来将某些 NVIDIA 软件组件安装到 Je…...
