115. ソートされた配列内の重複を削除するremoveDuplicatesFromSortedArray

質問の説明

質問リンク

配列 nums が昇順に配置されている場合、各要素が 1 回だけ表示されるように、繰り返される要素を所定の位置で削除し、削除後の配列の新しい長さを返します。要素の相対的な順序は一貫したままでなければなりません。次に、一意の要素の数を nums で返します。

nums の一意の要素の数が k であることを考慮すると、ソリューションが確実に渡されるようにするには、次のことを行う必要があります。

nums の最初の k 要素に、最初に nums に出現した順序で一意の要素が含まれるように、配列 nums を変更します。nums の残りの要素は、nums のサイズにとって重要ではありません。
kを返します。
判断基準:

システムは次のコードを使用してソリューションをテストします。

int[] nums = [...]; // 输入数组
int[] expectedNums = [...]; // 长度正确的期望答案

int k = removeDuplicates(nums); // 调用

assert k == expectedNums.length;
for (int i = 0; i < k; i++) {
    
    
    assert nums[i] == expectedNums[i];
}

すべてのアサーションが合格すると、ソリューションも合格します。

例 1:

入力: nums = [1,1,2]
出力: 2、nums = [1,2,_]
説明: 関数は新しい長さ 2 を返す必要があり、元の配列 nums の最初の 2 つの要素は 1 に変更されます。 2. 新しい長さを超える配列内の要素は考慮する必要はありません。

例 2:

入力: nums = [0,0,1,1,1,2,2,3,3,4]
出力: 5、nums = [0,1,2,3,4]
説明: 関数は新しい値を返す必要があります。長さは 5 で、元の配列 nums の最初の 5 つの要素は 0、1、2、3、4 に変更されます。新しい長さを超える配列内の要素は考慮する必要はありません。

ヒント:

  • 1 <= nums.length <= 3 * 104
  • -104 <= nums[i] <= 104
  • nums は昇順にソートされます

問題解決のアイデア

HashSet の無秩序な性質により、最初に追加されたものが後から追加される可能性があるため、考慮されません。

  1. まずコレクションを作成してから、最初の要素をコレクションに追加します。
  2. セット set の非反復的な性質により、nums 配列を走査し、nums の各要素をセットに直接追加します。同じ要素は 1 つだけ追加されます。
  3. 配列自体の順序とコレクションの順序により、コレクションの内容が必要なものになります。コレクションを走査し、配列の要素を変更します。
  4. コレクションのサイズを直接返すだけです。

詳しいコードの説明

package question;

import java.util.LinkedHashSet;
import java.util.Set;

/**
 * @author keke
 * @version 1.0
 * @className Question115
 * @description
 * @time 2023/5/28 21:38
 */
public class Question115 {
    
    

    public static void main(String[] args) {
    
    
        // 输入数组
        int[] nums = {
    
    0, 0, 1, 1, 1, 2, 2, 3, 3, 4};
        // 长度正确的期望答案
        int[] expectedNums = new int[]{
    
    0, 1, 2, 3, 4};

        // 调用
        int k = removeDuplicates(nums);

        assert k == expectedNums.length;
        for (int i = 0; i < k; i++) {
    
    
            assert nums[i] == expectedNums[i];
        }
        System.out.println("答案正确");
    }

    private static int removeDuplicates(int[] nums) {
    
    
        Set<Integer> set = new LinkedHashSet<>();
        set.add(nums[0]);
        for (int i = 1; i < nums.length; i++) {
    
    
            set.add(nums[i]);
        }
        int i = 0;
        for (Integer integer : set) {
    
    
            nums[i++] = integer;
        }
        return set.size();
    }
}

スクリーンショットを実行する

ここに画像の説明を挿入します

おすすめ

転載: blog.csdn.net/weixin_43344151/article/details/130917954