题目描述:
【self】: 题干的内容是在一个有序的数组内,去除重复元素 ; 要求改变的原有数组,并且返回不重复元素的个数
解题思路分析:
这个题目最好的解决思路是用快慢指针,但是需要考虑这两个指针分别代表的含义;
判断当前数和它的后一个数是否相等,相等就后移一个数,并且接着判断后移的数和它后边的数是否相等,然后一直循环下去。不相等就将后一个数保存起来,并且长度加 1,然后结束循环。
不同解法:
/**
* @param {number[]} nums
* @return {number}
*/
//self:
//解题思路:
// 投机取巧,想要用Map类型,使用Map自带的方法和属性,以此来判断重复的元素
// map的key记录的是不重复的元素,value 记录的是索引号,如果现有map里不存在该元素,添加到map
var removeDuplicates = function(nums) {
var map = new Map();
var j = 0;
for(var i = 0; len = nums.length, i<len; i++){
if(!map.has(nums[i])){
map.set(nums[i],i)
nums[j] = nums[i];
j++;
}
}
return map.size;
};
//解题思路:
// wang's solution https://leetcode.wang/leetCode-26-Remove-Duplicates-from-Sorted-Array.html
// 一开始看不懂得写写画画,后来理解了,这样的写法比普通的减少了循环次数
var removeDuplicates = function(nums) {
var len = 1;
for (var i = 0; i < nums.length - 1; i++) {
while (i < nums.length - 1) {
if (nums[i] == nums[i + 1]) {
i++;
console.log(i)
} else {
nums[len] = nums[i + 1];
len = len + 1;
console.log('break'+ i)
break;
}
}
}
return len;
}
// 大牛 solution
//解题思路:
// 使用快慢指针。慢指针循环整个数组,快指针用来表示不重复的元素的索引
var removeDuplicates = function(nums) {
var fast = 1, slow = 0;
var len = nums.length;
while(fast < len){
if(nums[fast] != nums[slow]){
slow++;
nums[slow] = nums[fast];
}else{
fast++;
}
}
// for(fast; fast<len; fast++){
// if(nums[fast] != nums[slow]){
// slow++;
// nums[slow] = nums[fast];
// }
// }
return slow+1; // slow 记录的是索引号,但要求返回长度,所以加1
}
参考链接:
- 26. Remove Duplicates from Sorted Array · leetcode
- JS数据类型之Map (详细解释了Map 类型自带的属性和方法以及使用)