题意:
给一个有序数组,对于其中每种数字,如果多于两个,则去除多于两个的部分,并返回新数组的长度。
分析:
从旧数组到新数组,第一想法就是遍历旧数组(一个指针),生成新数组,一个指针。
那么,什么时候新数组的指针移动呢?(即放入新数组)应该是当旧数组的相邻数值不同的时候。
一种数字,只有一个:放这个进入新数组
一种数字,只有两个:放这两个进入新数组
一种数字多于两个,多于的就不放了,但要确认已经放入了两个。
现在的问题是,如何判断是哪种情况:我们先尝试合并转化以上三种情况:当一种数字少于等于两个的时候,就全部放入。
那么放入条件:同一种数字有一个或两个,就放入一个或两个。
换言之:只要不是同一种数字出现第三次,前面的出现多少就放多少。
所以再思考放入条件:当一个数字出现第三次及以上的时候不放入,其它时候放入。
现在,问题转化:什么时候知道数字出现第三次呢?=》当新数组已经有两个的时候。
所以:只要不是第三个相同的就放入。
public class Solution {
public int removeDuplicates(int[] nums) {
int j = 0;
for (int i=0; i<nums.length; i++)
if (j < 2 || nums[i] != nums[j-2]){
nums[j] = nums[i];
j++;
}
return j;
}
}
反思:对于一个问题要紧紧抓住实质,去分析,转化,从多个方面来分析,归并,转化,分解。比如:思考什么是要放入的,可以转而思考什么是不放入的......