题目描述
给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。
由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项之后有 k 个元素,那么 nums 的前 k 个元素应该保存最终结果。
将最终结果插入 nums 的前 k 个位置后返回 k 。
不要使用额外的空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。。
题目要求
1 <= nums.length <= 3 * 104
-104 <= nums[i] <= 104
nums
已按 升序 排列
具体实例
示例1:
输入:nums = [1,1,2]
输出:2, nums = [1,2,_]
解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。
示例2:
输入:nums = [0,0,1,1,1,2,2,3,3,4]
输出:5, nums = [0,1,2,3,4]
解释:函数应该返回新的长度 5 , 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。不需要考虑数组中超出新长度后面的元素。
实现方法
main方法
public static void main (String[] args) {
int[] a = new int[]{1,1,2};
Q026 b = new Q026();
System.out.println(b.removeDuplicates(a));
}
方法1:
public int removeDuplicates(int[] nums) {
//记录数组中不重复元素的个数
int count = 0;
//判断nums是否为空
if(nums==null||nums.length==0){
return count;
}
//创建一个新数组
int[] num = new int[nums.length];
//声明两个索引i,j
int i=0;//原数组索引
int j=0;//新数组索引
//将原数组的第一个位置放到新数组的第一个位置
num[j]=nums[i];
//j不动,i后移
i+=1;
count++;//因为第一个已经有了,所以count++
while(i< nums.length){
//使用num[j]与nums[i]比较
if(num[j]==nums[i]){
i+=1;//若相同,则i后移
}else{//若不同,将j+=1,然后把nums[i]的赋给num[j]
num[++j]=nums[i++];
count++;
}
}
//将新数组中的值全部赋值给原数组
for(i=0;i<nums.length;i++){
nums[i]=num[i];
}
return count;
}
方法2:
public int removeDuplicates(int[] nums) {
int i=1,j=0;
if(nums==null||nums.length==0){
return 0;
}
while(i<nums.length){
if(nums[j]==nums[i]){
i++;
}else{
j++;
nums[j]=nums[i];
i++;
}
}
return ++j;
}
方法3:
public int removeDuplicates(int[] nums) {
if(nums==null||nums.length==0){
return 0;
}
int[] a= Arrays.stream(nums).distinct().toArray();
// 变成流 去重 变成数组
//int[] arr = Stream.of(nums).distinct().toArray();
//Integer可用
//将新数组放到原数组
for(int i=0;i<a.length;i++){
nums[i]=a[i];
}
return a.length;
}
结果描述