题目
题解
方法1
遍历移除法
这是一个有序数组,就是有重复的元素一定是挨在一起的,所以我们循环遍历,要是发现当前元素和后面元素相同,只需要删除当前的元素就可以。所以我们要用splice方法
array.splice(index,howmany)
这个方法就是指定序号进行删除
var nums = [1,1,2];
for(var i =0;i<nums.length;i++){
if(nums[i] === nums[i+1]){
nums.splice(i,1);
i--;
}
}
console.log(nums);//[1,2]
console.log(nums.length);//2
第一轮循环,i=0,那么num[i]与num[i+1]相等都是1,现在删除第一个元素1,现在数组就变成[1,2].
i–=0-1=-1
第二轮循环,i进行i++,变成i=0,num[i]与num[i+1]不等。
第三轮循环,i=0后,后面没有数字了就没法对比了。现在就可以返回当前数组的长度了
方法2
双指针法
[2,2,4,4,4,6]
我们换个思维,题目是删除重复项,结果需要我们返回的是移出后的数组,也就是说现在这个数组我们可以变为[2,4,6,2,4,4].不管数组后面变成什么样前面的2,4,6是我们需要的,然后返回前面所需要的数组长度就可以了(长度3)。这个方法的核心是把后面的元素替换为前面重复的元素,我们只需要管理不重复元素,为了判断前后元素是否相同,所以要双指针
父子来果园摘果子,每个水果只能摘一次,父子计划分工合作。最开始父子俩站在起点,发现了一个草莓,于是放到篮子里,父亲不愿意让儿子累着,让儿子提着篮子在原地等候自己大步向前,发现第二个草莓没有动手摘然后继续向前发现了一个哈密瓜,然儿子向前一步,然后把哈密瓜给了儿子
之后发现哈密瓜都没有捡,然后发现了西瓜,让儿子向前一步,把西瓜给了儿子。然后篮子里有不同的水果并且没重复。现在儿子站的地方和篮子里的水果数量相同,所以知道儿子的位置就知道了水果数量
var nums = [2,2,4,4,4,6];
for(var son = 0,dad = 0;dad<nums.length;dad++){
if(nums[son]!==nums[dad]){
son++;
nums[son] = nums[dad];
}
}
console.log(son+1);