- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
数组高频面试题及手写答案
一、基础必考题:移除数组中的元素(原地修改)
题目:给定一个数组nums和一个值val,你需要原地移除所有数值等于val的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用O(1)额外空间并原地修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
示例:输入nums=[3,2,2,3],val=3→输出长度2,数组变为[2,2]
手写答案:
functionremoveElement(nums,val){
letslow=0;//慢指针:指向新数组的末尾
for(letfast=0;fastnums.length;fast++){
if(nums[fast]!==val){
nums[slow]=nums[fast];//覆盖目标元素
slow++;//慢指针仅在赋值后移动
}
}
returnslow;//慢指针位置即新长度
}
易错点:
误用splice:循环中用splice会导致数组长度变化,漏删元素(如[2,2,3]删2时,索引1会变成原索引2的元素);
双指针逻辑颠倒:需明确“快指针探路、慢指针存有效元素”,而非相反。
二、边界处理题:寻找数组中的峰值
题目:峰值元素是指其值严格大于左右相邻值的元素。给你一个整数数组nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回任何一个峰值所在位置即可。你可以假设nums[-1]=nums[n]=-∞(数组两端视为负无穷)。
示例:输入nums=[1,2,3,1]→输出2;输入nums=[1,2,1,3,5,6,4]→输出1或5
手写答案:
functionfindPeakElement(nums){
letleft=0;
letright=nums.length-1;
//二分法:利用“峰值一定存在”的特性
while(leftright){
constmid=Math.floor((left+right)/2);
//右侧是上升趋势,峰值在右侧
if(nums[mid]nums[mid+1]){
left=mid+1;
}else{
//左侧是下降趋势,峰值在左侧(含mid)
right=mid;
}
}
returnleft;//循环结束时left===right,即为峰值索引
}
核心思路:
无需遍历全部元素,二分法O(logn)效率更高;
利用“两端是负无穷”,数组必然存在峰值:若mid右侧更大,说明右侧有上升段,峰值在右侧;反之左侧有下降段,峰值在左侧。
三、优化思维题:最大子数组和
题目:给你一个整数数组nums,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例:输入nums=[-2,1,-3,4,-1,2,1,-5,4]→输出6(连续子数组[4,-1,2,1]的和最大)
手写答案(Kadane算法):
functionmaxSubArray(nums){
letcurrentSum=nums[0];//当前子数组的和
letmaxSum=nums[0];//全局最大和
for(leti=1;inums.length;i++){
//关键决策:当前元素是“加入之前的子数组”还是“重新开始新子数组”
currentSum=Math.max(nums[i],currentSum+nums[i]);
//更新全局最大和
maxSum=Math.max(maxSum,currentSum);
}
returnmaxSum;
}
为什么不用暴力法:
暴力枚举所有子数组需O(n2)时间,当n=10?时会超时;
Kadane算法O(n)遍历:每一步只做局部最优决策(保留有效子数组,抛弃负贡献的前缀),自然得到全局最优。
四、变形题:数组中的第K个最大元素
题目:给定整数数组nums和整数k,请返回数组中第k个最大的元素。请注意,你需要找的是数组排序后的第k个最大的元素,而不是第k个不同的元素。
示例:输入nums=[3,2,1,5,6,4],k=2→
原创力文档


文档评论(0)