删除有序数组中的重复项
26. 删除有序数组中的重复项
这道题我们尝试使用快慢指针来解题:
快指针在前面进行对数组元素的遍历,慢指针判断,如果与快指针所指的元素不同,那么指针向右移动,然后进行赋值,最后新数组的长度等于慢指针的索引加1。
//这里我们使用快慢指针
/**
* @param {number[]} nums
* @return {number}
*/
var removeDuplicates = function(nums) {
if(nums.length === 0) return 0;
let slow = 0;
let fast = 0;
while(fast < nums.length){
if(nums[fast] != nums[slow]){
slow++;
nums[slow] = nums[fast];
}
fast++;
}
return slow+1;
}
删除排序链表中的重复元素
/**
* @param {ListNode} head
* @return {ListNode}
*/
var deleteDuplicates = function(head) {
if(head == null) return head;
let slow = head;
let fast = head;
while(fast != null){
if(slow.val != fast.val){
slow.next = fast;
//slow++
slow = slow.next;
}
//fast++
fast = fast.next;
}
//断开与后面重复元素的连接 !!!
slow.next = null;
return head;
};
移除元素
/**
* @param {number[]} nums
* @param {number} val
* @return {number}
*/
var removeElement = function(nums, val) {
if(nums.length == 0) return 0;
let slow = 0;
let fast = 0;
while(fast < nums.length){
if(nums[fast] != val){
//这里有一个细节,就是我们在对num[slow]赋值完以后再对slow++,保证nums[0..slow-1]是不包含val的元素
nums[slow] = nums[fast];
slow++;
}
fast++;
}
return slow;
};
移动零
283. 移动零
这道题,有多种解法
我们针对快慢指针,可以这么想,将0移到后面,其实就是移除nums中的所有0,然后再把后面的元素都赋值为0即可。
/**
* @param {number[]} nums
* @return {void} Do not return anything, modify nums in-place instead.
*/
var moveZeroes = function(nums) {
//去除nums中所有0,返回不含0的数组长度
let p = removeElement(nums,0);
for(;p < nums.length;p++){
nums[p] = 0;
}
};
function removeElement(nums, val){
if(nums.length == 0) return 0;
let slow = 0;
let fast = 0;
while(fast < nums.length){
if(nums[fast] != val){
nums[slow] = nums[fast];
slow++;
}
fast++;
}
return slow;
};