题目(详见leetcode)
https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/
给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后的数组。
不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
提示:
0 <= nums.length <= 3 * 104
-104 <= nums[i] <= 104
nums
已按升序排列
这里利用快慢双指针解决这个问题
附上官方代码:
var removeDuplicates = function(nums) {
const n = nums.length;
if (n === 0) {
return 0;
}
let fast = 1, slow = 1;
while (fast < n) {
if (nums[fast] !== nums[fast - 1]) {
nums[slow] = nums[fast];
++slow;
}
++fast;
}
return slow;
};
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/solution/shan-chu-pai-xu-shu-zu-zhong-de-zhong-fu-tudo/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
1.看到后我作为数据结构小白想到一个问题,为什么slow不从0开始?我看图解也没有看出所以然,然后我自己画了一个图,就明白了:
以上文中已经升序排列的数组为例子:
1>当slow=0,fast=1时,根据if判断,arr中索引为1和0的元素值相等,arr[0]依旧为1,fast指向下一个位置
2>当slow=0,fast=2时,根据if判断,arr中索引为slow=0的元素被替换为arr[2]=2,这样这个数组索引为0的值就算没有重复也被删除了,不合理。
2.关于return
官方解题要求返回删除后的数组长度,遍历结束后,从arr[0]到arr[slow-1]的每个元素都不相同而且包含原数组中每个不同的元素,因此返回新的长度slow。
这里贴上一个我自己指定数组,删除重复项的方法:
1.首先数组没有升序排列,可以用数组排列对数组进行升序排列:
arr.sort(function(a, b){return a - b});
2.然后添加判断条件
3.裁剪(slice)或删除数组(splice)多余部分
代码实现:
<body>
<p id="demo"></p>
<script>
//新建一个数组
var arr = [1,2,3,2,1,3,4,2,5];
//数组升序排列
arr.sort(function(a, b){return a - b});
var fast = 1,slow = 1;
while( fast<arr.length ){
if(arr[fast] != arr[fast-1]){
arr[slow] = arr[fast] ;
++slow;
}
++fast;
}
//slice裁剪
var newArr = arr.slice(0,slow);
document.getElementById("demo").innerHTML = newArr;
//splice删除
arr.splice(slow,arr.length);
document.getElementById("demo").innerHTML = arr;
// return slow;
</script>
</body>
还有一种在初级学习JS时网课里老师讲的方法
不用先按顺序排列,冒泡排序
贴上代码:
<body>
<p id="demo"></p>
<script>
//新建一个数组
var arr = [1,2,3,2,2,1,3,4,2,5];
//去除数组的重复数
//获取数组中每一个元素
for(var i=0 ; i<arr.length ; i++){
//获取当前元素之后的所有数
for(var j=i+1 ; j<arr.length ; j++){
//判断两个值是否相等
if(arr[i] == arr[j]){
//相等证明出现的重复的元素,则删除j对应的元素
arr.splice(j,1);
//当删除了当前j所在的元素以后,后面元素自动补位
//此时将不会再比较这个元素,需要再比较依次j所在位置的元素
//使j自减
j--;
}
}
}
document.getElementById("demo").innerHTML = arr;
</script>
</body>
注意j--; 如果数组中有连续两个相同的元素,如果不添加j--,会重复出现相同的元素。