RemoveDuplicatesFromSortedArrayI II,移除有序数组里的重复元素以及移除数组里的某个元素

RemoveDuplicatesFromSortedArrayI:

问题描述:给定一个有序数组,去掉其中重复的元素。并返回新数组的长度。不能使用新的空间。

[1,1,2,3] -> [1,2,3] 3

算法思路:用一个数字记录新数组的最后一个元素的位置

 1 public class RemoveDuplicatesFromSortedArray {
 2     
 3     public int removeDuplicates(int[] nums)
 4     {
 5         if(nums.length == 0)
 6         {
 7             return 0;
 8         }
 9         int key = nums[0];
10         int count = 0;//记录新数组最后一个元素的位置,即新数组长度
11         for(int i = 0; i < nums.length; i ++)
12         {
13             if(nums[i]!=key)
14             {
15                 nums[count++] = key;
16                 key = nums[i];
17             }
18         }
19         nums[count++] = key;
20         return count;
21     }
22 }

 与之类似的就是移除数组里某个元素。

 1 public int removeElement(int[] nums, int val) {
 2         if(nums.length == 0)
 3         {
 4             return 0;
 5         }
 6         int count = 0;
 7         for(int i = 0; i < nums.length; i ++)
 8         {
 9             if(nums[i]!=val)
10             {
11                 nums[count++] = nums[i];
12             }
13         }
14         return count;
15     }

 RemoveDuplicatesFromSortedArrayII:

问题描述:可以重复一次。

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 1122 and 3. It doesn't matter what you leave beyond the new length.

算法分析:这种题目,要巧妙利用数组的下标,和上一题解法相似,只不过,循环里的判断条件变了。

//[1,1,1,2,2,3] -> [1,1,2,2,3] 5 允许重复一次
public class RemoveDuplicatesfromSortedArrayII 
{
	public int removeDuplicates(int[] nums) 
	{
		if(nums.length == 0 || nums.length == 1)
		{
			return nums.length;
		}
		int count = 1, temp = nums[1];
		for(int i = 2; i < nums.length; i ++)
		{
			if(nums[i] != nums[i - 2])
			{
				nums[count++] = temp;
				temp = nums[i];
			}
		}
		nums[count++] = temp;
		return count;
    }
}

 

posted @ 2016-06-01 14:41  32ddd  阅读(197)  评论(0编辑  收藏  举报