描述
给定一个升序排列的的长度为 n 的数组 nums,请你删除一部分这个数组的重复元素(数组元素需要原地改变),让这个数组的中每个数字都严格大于前一个数(第一个数除外),然后返回删除过后该数组的长度。
数据范围:数组的长度满足 1≤n≤10 ^5
,数组中的数满足 1≤val≤10 ^9
示例1
输入:[1,2,3,4]
返回值:4
[1,2,3,4]
示例2
输入:[1,3,3,4,4,5]
返回值:4
[1,3,4,5]
说明:
删除后的数组是 [1,3,4,5]
思路:利用LinkedHashSet去重并排序,即可得到最后的长度。
但是数组没有变动,导致用例不能通过,这里需要将重复的值放到去重后数组的后面就行。因此,通过将重复的值保存进list,最后重新将nums值赋值。(过程相对来说异常繁琐了,来自菜🐕的检讨)
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums int整型一维数组
* @return int整型
*/
public int reArrangeArray (int[] nums) {
// write code here
HashSet<Integer> res = new LinkedHashSet<>();
ArrayList<Integer> list = new ArrayList<>();
for(int i = 0; i< nums.length;i++){
if(res.contains(nums[i])){
list.add(nums[i]);
continue;
}
res.add(nums[i]);
}
ArrayList<Integer> result = new ArrayList<>();
int[] r = res.stream().mapToInt(Integer::intValue).toArray();
for(int i = 0;i<r.length;i++){
nums[i] = r[i];
}
for(int i = 0; i<list.size();i++){
nums[r.length+i] = list.get(i);
}
return r.length;
}
}
双指针方法;
int reArrangeArray(int* nums, int numsLen ) {
int i = 0, j = 1;
while(j < numsLen){
if(nums[i] == nums[j])
j++;
else
nums[++i] = nums[j++];
}
return i+1;
}