题目:
给你一个 升序排列 的数组 nums
,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。
由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项之后有 k
个元素,那么 nums
的前 k
个元素应该保存最终结果。
将最终结果插入 nums
的前 k
个位置后返回 k
。
不要使用额外的空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
判题标准:
系统会用下面的代码来测试你的题解:
int[] nums = [...]; // 输入数组
int[] expectedNums = [...]; // 长度正确的期望答案
int k = removeDuplicates(nums); // 调用
assert k == expectedNums.length;
for (int i = 0; i < k; i++) {
assert nums[i] == expectedNums[i];
}
代码:
class Solution {
public int removeDuplicates(int[] nums) {
//获得数组长度
int length = nums.length;
//用于递增判断是否与下面的值相等的数
int num = nums[0];
//用于返回的个数(因为是从高到低减少,所以默认未数组长度)
int count = length;
//用于记录某个下标需要替换的位置(因为第一个数肯定不会被换、默认为0)
int temp =1;
//如果为0直接返回
if (length == 0) {
return 0;
}else {
//因为判断中会有i+1的情况,所以不用考虑最后一个值
for (int i = 0; i < length-1; i++) {
if (num == nums[i+1]){
//如果有数值相等 个数减1
count--;
}else {
//如果不是想等,将后面一个值赋给num,用于递增
num = nums[i+1];
nums[temp]=nums[i+1];
//因为不相等,所以temp需要往后移位
temp++;
}
}
return count;
}
}
}