283. 移动零
方法一:直接解法
var moveZeroes = function(nums) {
let n=0;
for(let i=0;i<nums.length;i++){
if(nums[i]!==0){
nums[n]=nums[i];
n++;
}
}
for(let i=n;i<nums.length;i++){
nums[i]=0;
}
};
方法二: 快慢指针
var moveZeroes = function(nums) {
let slow=0;
let fast=0;
let temp=0;//定义一个中间值方便交换快慢指针上的值
while(fast<nums.length){
if(nums[fast]!==0){
temp=nums[slow];
nums[slow]=nums[fast];
nums[fast]=temp;
slow++;
}
fast++;
}
};
167. 两数之和 II - 输入有序数组
1、map
var twoSum = function(numbers, target) {
let map=new Map();
for(let i=0;i<numbers.length;i++){
if(map.has(target-numbers[i])){
return [map.get(target-numbers[i])+1,i+1];//这里因为题目要求,所以需要加1
}else{
map.set(numbers[i],i);
}
}
return [0,0];
};
2、双指针
var twoSum = function(numbers, target) {
let left=0;
let right=numbers.length-1;
while(left<right){
let num=numbers[left]+numbers[right];
if(num<target){//值小了,左指针向右移动一位
left++;
}else if(num>target){//值大了,右指针像左移动
right--;
}else{
return [++left,++right];
}
}
};
总结
第一题的快慢指针中,每次交换快慢指针上的值,就只需要判断快指针结束就行了,而且不需要重新给后面的值赋值为0
第二题考察的应该是双指针,但是类似的题可以用hasMap做,需要注意的是题目要求,我这里开始以为数组是nums,执行直接报错,然后就是后置加加是先返回在运算,所以结果的返回需要前置++