【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 }