蓝桥:前端开发笔面必刷题——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,都快接近我了。 后来才知道人家是个卷王,从早干到晚就差搬张床到工位睡觉了…...
一台电脑如何实现四人同屏游戏?Nucleus Co-Op 分屏神器深度解析
一台电脑如何实现四人同屏游戏?Nucleus Co-Op 分屏神器深度解析 【免费下载链接】nucleuscoop Starts multiple instances of a game for split-screen multiplayer gaming! 项目地址: https://gitcode.com/gh_mirrors/nu/nucleuscoop 你是否曾经梦想过和朋友…...
OpenLayers7实战速成:从零构建你的第一个WebGIS应用
1. 为什么选择OpenLayers7? 如果你正在寻找一个强大且免费的开源WebGIS开发库,OpenLayers7绝对值得考虑。作为一个长期从事地图开发的老兵,我见证了这个库从最初的复杂难用到现在的简洁高效。最新版本不仅性能大幅提升,API设计也更…...
用SU-03T离线语音模块给STM32项目加个‘嘴’和‘耳朵’:从智能公元配置到串口通信全流程
用SU-03T离线语音模块为STM32项目打造智能交互系统 在嵌入式开发领域,语音交互正逐渐成为提升用户体验的关键功能。SU-03T作为一款高性价比的离线语音识别模块,能够为STM32项目快速添加"听"和"说"的能力,而无需依赖云端服…...
智谱对标Anthropic,“中国版”之路挑战几何?
智谱业务模式从“重”到“轻”的转型探索2025年以来,智谱正经历业务模式的重大转变,从过去“卖发电机”的本地化部署模式,切换到AI时代的“卖电”生意,即云端API服务。以往本地化部署模式虽利润不低、客户粘性高,但属于…...
yz-女生-角色扮演-造相Z-Turbo实现大模型压缩与加速技术
yz-女生-角色扮演-造相Z-Turbo实现大模型压缩与加速技术 效果展示类文章:本文重点展示yz-女生-角色扮演-造相Z-Turbo模型在压缩与加速技术方面的实际效果,通过对比分析展示其性能提升和生成质量。 1. 技术亮点概览 yz-女生-角色扮演-造相Z-Turbo是一款专…...
新手必看:UDOP-large文档理解模型从部署到实战全流程
新手必看:UDOP-large文档理解模型从部署到实战全流程 1. 引言:文档理解的新选择 在数字化办公时代,我们每天都要处理大量文档——论文、合同、发票、报告...传统的人工处理方式不仅效率低下,还容易出错。想象一下,如…...
告别工业UI!Ostrakon-VL像素终端如何提升一线员工图像识别体验
告别工业UI!Ostrakon-VL像素终端如何提升一线员工图像识别体验 1. 重新定义零售图像识别体验 在零售和餐饮行业,一线员工每天需要处理大量图像识别任务:检查货架商品、核对价签、评估店面环境等。传统工业级UI界面往往设计呆板、操作复杂&a…...
OpenClaw 飞书机器人对接教程,零基础一步到位
前言 OpenClaw(小龙虾)v2.6.0版本支持飞书机器人对接,完成配置后,可直接在飞书聊天窗口向机器人发送自然语言指令,由OpenClaw自动拆解任务、操控电脑执行操作,实现飞书端远程下达AI任务的效果。 OpenClaw…...
Vivado里用Block Memory Generator搞个双端口RAM,这5个坑我帮你踩过了
Vivado双端口RAM配置实战:Block Memory Generator避坑指南 在FPGA开发中,高效利用片上存储资源是提升系统性能的关键。Xilinx Vivado提供的Block Memory Generator(BMG)IP核能够快速生成优化的存储结构,但其中双端口RA…...
快速上手语音情感AI:Emotion2Vec+ Large镜像实战体验
快速上手语音情感AI:Emotion2Vec Large镜像实战体验 1. 语音情感识别技术简介 语音情感识别技术正在改变我们与机器交互的方式。这项技术通过分析语音中的声学特征,能够准确识别说话人的情绪状态。Emotion2Vec Large作为当前最先进的语音情感识别模型之…...
