Leetcode-80ソート配列の重複を削除

9519 ワード

Leetcode-80ソート配列の重複を削除
タイトルの説明
ソート配列を指定すると、重複する要素をその場で削除し、各要素が最大2回表示され、削除後の配列の新しい長さを返す必要があります.
余分な配列空間を使用しないでください.入力配列をその場で変更し、O(1)余分な空間を使用する条件で完了する必要があります.
例1:
与えられたnums=[1,1,1,2,2,3],
関数は新しい長さlength=5を返し、元の配列の最初の5つの要素は1,1,2,2,3に変更されます.
配列の中で新しい長さの後ろを超える要素を考慮する必要はありません.例2:
与えられたnums=[0,0,1,1,1,2,3,3],
関数は新しい長さlength=7を返し、元の配列の最初の5つの要素は0,0,1,1,2,3,3に変更されます.
配列の中で新しい長さの後ろを超える要素を考慮する必要はありません.説明:
なぜ返される数値は整数ですが、出力される答えは配列ですか?
入力配列は「参照」で渡されます.これは、関数で入力配列を変更することが呼び出し元に表示されることを意味します.
内部操作は次のように想像できます.
// nums   “  ”     。    ,         
int len = removeDuplicates(nums);

//                    。
//            ,                    。
for (int i = 0; i < len; i++) {
    print(nums[i]);
}
class Solution {
    public int removeDuplicates(int[] nums) {
        if(nums.length==0||nums==null)
            return 0;
        int value=nums[0];
        int length=nums.length;
        int num=1;
        for(int i=1;i<length;i++)
        {
            if(nums[i]==value)
                num++;
            else{
                value=nums[i];
                if(num>2)
                {
                    for(int j=i;j<length;j++)
                    {
                        nums[j-num+2]=nums[j];
                    }
                    length-=num-2; 
                    i-=num-2; 
                }
                num=1;
            }
        }
        if(num>2)
            length-=num-2;
        return length;
    }
}

かつて犯した3つの間違い:1、numの値を早めに変えて、プログラムは永遠に配列を変えません
else{
    value=nums[i];
    num=1;
    if(num>2)
    {
        for(int j=i;j<length;j++)
        {
            nums[j-num+2]=nums[j];
        }
        length-=num-2;  
        i-=num-2;
    }
}

2、
i-=num-2;

インデックスを変更せず、配列が変更され、インデックスに対応する値も変更されます3、
if(num>2)
{
    length-=num-2;  
}

配列の最後の数の個数に注目しないで、最後の数の個数が2より大きい場合も修正します