删除有序數組中的重複項
方法一:自己寫的答案
思路:
- 把數組的長度指派給len
- 進入循環,不是最後一個值則判斷是否重複,重複則将後續的值依次往前挪,将重複值覆寫,len–
- nums[j]–的原因時,j-1目前已經時最後一個值的索引了,但是後續數值并沒有删除,當nums[j-1]==nums[j]的時候将會陷入死循環,是以需要修改後續的值,至于為什麼是自減1,是因為給數組是遞增的,自減1才不會與前面的值重複
- 同時考慮可能有多個重複值,使用while循環
- 傳回len
class Solution {
public int removeDuplicates(int[] nums) {
int len = nums.length;
for (int i=0;i<len;i++){
if (i<len-1) {
while (nums[i]==nums[i+1]){
int j = i+1;
while (j<len-1){
nums[j] = nums[j+1];
j++;
}
nums[j]--;
len--;
}
}
}
return len;
}
}
方法二:看了下評論區的c++答案,使用java實作
思路:利用一個新的索引len抽象出一個新的數組
- 将len=0,即給虛拟新數組nums[0]指派,因為nums不用考慮是否重複,可以直接指派
- 将索引1及後面的值,都與nums[len]比較,如果不重複,則将給nums[len+1]指派目前nums[i]的值,如果重複,不做操作,相當于沒有給新數組加入重複值,同時保持len的值時虛拟數組最後一個值的索引
- 由于數組長度為數組最後一個值的索引+1,傳回len+1
class Solution {
public int removeDuplicates(int[] nums) {
if (nums.length<2) return nums.length;
int len = 0;
for (int i=1;i<nums.length;i++){
if (nums[len]!=nums[i]) nums[++len] = nums[i];
}
return ++len;
}
}