题目链接:Remove Duplicates from Sorted Array
题意是:给定一个已经排序的数组,删除重复的位置,使每个元素只显示一次并返回新的长度。
同时不要分配另一个数字,占用额外空间
这里主要是有三个需要注意的地方:已经排序的数组,删除位置,不能占用额外空间。
刚开始只是想着当发现重复数据就使数组长度减1就可以了,但是使用无法通过LeedCode,再仔细读一遍题意,是需要删除重复位置的,因为是已经排好序的,因此只需要首先比较相邻位置的元素是否相同即可。
思路如下:
1、初始化i=0,比较nums[i]和nums[i+1]是否相同,如果相同,则将i+1后的元素依次往前移,即删除i+1的位置,并且len-1;
2、如果不相同,则i+1,继续比较相邻位置元素,以此类推
public int removeDuplicates(int[] nums) {
int len = nums.length;
//int relen = len;
int i=0;
//首先需要判断当len的长度为0或者为1的情况
if(len==0||len==1)
return len;
do{
if(nums[i]==nums[i+1])
{
//先删除位置,再将长度减1;
for(int j=i+1;j<len-1;j++)
nums[j]=nums[j+1];
len--;
}
else
i++;
}while(i<len-1);
return len;
}
虽然这几次编写的都是简单的题目,还花费了一定得时间,但是基本都是通过自己的思考和编写做出来的,还是有进步的,继续加油了~
同样在网上搜索其他人的思路:
1、定义i指向非重复数组的尾部,并初始化i=0;
2、定义next指向需要处理的元素,初始化next=1;
3、比较nums[i]和nums[next]是否相等,如果相等,则next++;
4、如果不相等,则将nums[next]移动到nums[i+1];
public int removeDuplicates(int[] nums) {
int len = nums.length;
if(len==0||len==1)
return len;
int i=0;
int next=1;
while(next<len){
if(nums[next]==nums[i])
next++;
else
{
nums[i+1] = nums[next];
i++;
}
}
return i+1;
}
通过学习了其他的解法,发现自己的解法还是有点麻烦的,所以值得学习~