掘金团队号上线,助你 Offer 临门! 点击 查看详情
一、题目描述:
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
你可以假设数组中无重复元素。
示例 1:
输入: [1,3,5,6], 5
输出: 2
示例 2:
输入: [1,3,5,6], 2
输出: 1
示例 3:
输入: [1,3,5,6], 7
输出: 4
示例 4:
输入: [1,3,5,6], 0
输出: 0
二、思路分析:
1、 先使用indexOf判断,目标值是否属于数组,属于直接返回下标,不属于进入其他判断
2、 进入其他判断时,先考虑2种特殊情况:当目标值小于数组第一个值时,直接返回0;当目标值大于数组最后一个值时,直接返回数组的长度值
3、 考虑两种特殊情况后,在通过循环数组,先定义一个num记录比目标值小的数组值,最后得到多少个比目标值小的值,就返回这个num+1; 另外,如果目标值等于数组中某一个值,则直接返回这个值的index
三、AC 代码:
var searchInsert = function(nums, target) {
if(nums.indexOf(target)==-1){
if(target > nums[nums.length-1]) return nums.length
if(target < nums[0]) return 0
let num = 0;
for(let i=0;i<nums.length;i++){
if(nums[i] < target){
console.log(i)
num = num +1
}
if(target == nums[i]){
return i
}
}
return num
}else{
return nums.indexOf(target)
}
};
四、总结:
官方题解的思路:二分法查找
官方代码:
var searchInsert = function(nums, target) {
const n = nums.length;
let left = 0, right = n - 1, ans = n;
while (left <= right) {
let mid = ((right - left) >> 1) + left;
if (target <= nums[mid]) {
ans = mid;
right = mid - 1;
} else {
left = mid + 1;
}
}
return ans;
};
这里我有一点看不懂的是 >> ,通过查阅资料后,整理了一下关于>>的知识点:
JavaScript 位运算符
位运算符处理 32 位数。该运算中的任何数值运算数都会被转换为 32 位的数。结果会被转换回 JavaScript 数。
">>" 有符号右位移
例如: 5 >> 1等同于0101 >> 1,结果为0010,转换后是2
另外,今天我发现写文章可以设置主题,然后解题时间也比前几次快了,我要继续加油打卡!为了掘金大茶缸><
本文正在参与掘金团队号上线活动,点击 查看大厂春招职位