704:给定一个?n
?个元素有序的(升序)整型数组?nums
?和一个目标值?target
??,写一个函数搜索?nums
?中的?target
,如果目标值存在返回下标,否则返回?-1
。
看题目最容易想到的就是一个循环,一个一个的匹配,找到了直接返回下标,直到找到最后一个,没有找到返回-1;
具体代码实现如下:
/**
* @param {number[]} nums
* @param {number} target
* @return {number}
*/
var search = function(nums, target) {
let _index = 0;
while(_index < nums.length){
if(nums[_index] === target){
return _index
}
_index++
}
return -1
};
这道题有一个关键点是有序的数组,因为有序会想到另外一种思路,二分法;
具体代码实现如下:
var search = function(nums, target) {
let left = 0;
let right = nums.length-1;
while(left <= right){
const middle = left + parseInt((right-left)>>1);
if(nums[middle]>target){
right = middle-1;
} else if(nums[middle]<target){
left = middle+1
} else {
return middle
}
}
return -1;
};
27:给你一个数组?nums
?和一个值?val
,你需要?原地?移除所有数值等于?val
?的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用?O(1)
?额外空间并?原地?修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
题目要求是不能创建额外的空间,就只能操作原数组,在原数组中删除某个元素js中最擅长的就是splice方法了
具体代码实现如下:
var removeElement = function(nums, val) {
for(let i = 0; i<nums.length;){
if(nums[i]===val){
nums.splice(i,1);
} else {
i++;
}
}
return nums.length
};
使用了内置函数splice,感觉胜之不武;还有没有其他的方法呢?
尝试使用快慢指针,快指针遍历每一个元素,慢指针在遇到要删除的元素不向后移动即(不自增),最后返回慢指针就可以了;
具体代码实现如下:
var removeElement = function(nums, val) {
let slow = 0;
let fast = 0;
for(fast ; fast <nums.length;fast++){
if(nums[fast]!==val){
nums[slow]= nums[fast]
slow++
}
}
return slow
};
今天的分享就到这里,事已至此还是先吃饭吧!