Follow up for "Remove Duplicates":
What if duplicates are allowed at most twice?
For example,
Given sorted array nums = [1,1,1,2,2,3]
,
Your function should return length = 5
, with the first five elements of nums being 1
, 1
, 2
, 2
and 3
. It doesn't matter what you leave beyond the new length.
自己的思路是通过linkedhashmap存储每个元素出现的次数,当出现大于2时长度减一,然后遍历map赋值返回length。
public int removeDuplicates(int[] nums) { int length=nums.length; Map<Integer,Integer> map=new LinkedHashMap<>(); for(int i=0;i<nums.length;i++) { if(map.get(nums[i])==null) map.put(nums[i],1); else if(map.get(nums[i])==1) map.put(nums[i],2); else if(map.get(nums[i])==2) length--; } int k=0; for(Integer i:map.keySet()) { int num=map.get(i); while(num-->0) { nums[k++]=i; } } return length; }网上看到一个巧妙的解法,
题意为允许一个重复,所以判断就不是相邻而是相隔一个的数字是否不一样。
不一样就需要更新值,但注意到这题更新数组不能是当前的状态,而需要是更新前一个不同的数,用temp存当前值以便于下一次赋值。
public int removeDuplicatesII(int[] nums) { if(nums.length==0) return 0; if(nums.length==1) return 1; int num=1,temp=nums[1]; for(int i=2;i<nums.length;i++) { if(nums[i]!=nums[i-2]) { nums[num++]=temp; temp=nums[i]; } } nums[num++]=temp; return num; }