LeetCode283。ゼロ運動とLeetCode26。配列をソートし重複したエントリを削除します。

免責事項:この記事はブロガーオリジナル記事です、続くBY-SAのCC 4.0を著作権契約、複製、元のソースのリンクと、この文を添付してください。
このリンク: https://blog.csdn.net/Miaoshuowen/article/details/102688881

283ゼロ動
被写体の説明は
非ゼロ要素の相対的な順序を維持しながらNUMSにアレイを与え、全ての書き込み機能は、アレイ0の最後に移動しました。

示例:

输入: [0,1,0,3,12]
输出: [1,3,12,0,0]

説明:

1.必须在原数组上操作,不能拷贝额外的数组。
2.尽量减少操作次数。

思考:
方法1:遅いポインタ0,0の数に存在しない二重ポインタは、iがjは=とき必要が動作するように元の位置に設定されている;
方法2:排出位置0の非存在の数、残りの0アップ位置;
方法3:二重ポインタ、モバイル0切替バックされています。

コード:

	public int[] moveZeroes1(int nums[]) {
		int j = 0;
		for (int i = 0; i < nums.length; i++) {
			if (nums[i] != 0) {
				nums[j] = nums[i];
				if (i != j) {
					nums[i] = 0;
				}
				j++;
			}
		}
		return nums;
	}

	public int[] moveZeroes2(int nums[]) {
		int j = 0;
		for (int i = 0; i < nums.length; i++) {
			if (nums[i] != 0) {
				nums[j] = nums[i];
				j++;
			}
		}
		for (int p = j; p < nums.length; p++) {
			nums[p] = 0;
		}
		return nums;
	}

	public int[] moveZeroes3(int nums[]) {
		int j = 0;
		for (int i = 0; i < nums.length; i++) {
			if (nums[i] != 0) {
				int emp = 0;
				emp = nums[i];
				nums[i] = nums[j];
				nums[j] = emp;
				j++;
			}
		}
		return nums;
	}

26.ソートする配列内の重複した項目を削除
タイトル説明が
ソートされた配列を考えると、あなたはそれぞれの要素が削除され、配列の新しい長さを戻した後、一度だけ表示されるように、所定の位置に定期的な要素を削除する必要があります。

配列のための余分なスペースを使用しないでください、あなたは代わりに入力配列を変更し、使用のO(1)余分なスペースの条件の下で完了しなければなりません。

示例 1:

给定数组 nums = [1,1,2], 

関数は、2の新しい長さを返す必要があり、元の配列の最初の2つの要素はNUMS 1、2に変更されます。

あなたは、新しい配列の長さの後ろの要素を超えて検討する必要がありません。

示例 2:

给定 nums = [0,0,1,1,1,2,2,3,3,4],

新しい関数は、長さ5を返す必要があり、元の配列NUMSの最初の5つの要素は0、1、2、3、4に変更されます。

あなたは、新しい配列の長さの後ろの要素を超えて検討する必要がありません。

説明:

なぜ、戻り値は整数ですが、答えは、それの出力の配列ですか?

入力アレイは、入力アレイは、関数内の発呼者に見える変更することを意味する「参照」モードで渡されることに注意してください。

你可以想象内部操作如下:

// nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝
int len = removeDuplicates(nums);

// 在函数里修改输入数组对于调用者是可见的。
// 根据你的函数返回的长度, 它会打印出数组中该长度范围内的所有元素。
for (int i = 0; i < len; i++) {
    print(nums[i]);
}

アイデア:
モバイルゼロ同様に、ポインタの数を介してダウンポインタを横断する新たなポインタを待って、その後、アレイを介して、別のポインタを定義するには、新しいポインタが新しいポインタを更新され、この場合の数と等しくありません。

	public int removeDuplicates(int[] nums) {
		if (nums.length == 0) {
			return 0;
		}
		int i = 0;
		for (int j = 1; j < nums.length; j++) {
			if (nums[j] != nums[i]) {
				i++;
				nums[i] = nums[j];
			}
		}
		return i + 1;
	}

おすすめ

転載: blog.csdn.net/Miaoshuowen/article/details/102688881