English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
問題説明
既にソートされた配列が与えられた場合、配列内の重複要素を取り除き、一つの重複要素のみを残し、新しい配列の長さを返します。
要求:
配列に追加の空間を割り当てず、定数のメモリサイズを使用してインプレース操作を行わなければなりません。
例えば:
配列A=[1,1,2]に変わります。あなたの関数が呼び出された後は、長さlength=を返さなければなりません。2、そしてAが[1,2]。
入力
既にソートされた配列、例えば[1,1,2]。
出力
新しい配列の長さを返します、例えばlength=2。
クイック・スロウ・ポインタ法
fastポインタを使用して配列を巡回し、slowポインタは重複しない要素の次の要素を指します。
public static int removeDuplicates(int[] nums) { if (nums.length < 1) return nums.length; int slow = 1; for (int fast = 1; fast < nums.length; fast++) { if (nums[fast] != nums[slow - 1]) { nums[slow++] = nums[fast]; } } return slow; }
アニメーション表示:
拡張
既に並べ替えられた配列から重複を削除し、指定された桁数を保持します。
public static int removeDuplicatesN(int[] nums, int repeatN) { if (nums.length <= repeatN) return nums.length; int index = repeatN; for (int i = repeatN; i < nums.length; i++) { if (nums[i] != nums[index - repeatN]) { nums[index++] = nums[i]; } } return index; }
これで本文のすべての内容が終わりました。皆様の学習に役立てば幸いです。また、呐喊教程を多くのサポートをお願いします。
声明:本文の内容はインターネットから取得しており、著作権者に帰属します。インターネットユーザーにより自発的に貢献し、アップロードされた内容です。本サイトは所有権を有しておらず、人工的な編集は行われていません。著作権侵害が疑われる内容を見つけた場合は、メールで notice#w までお知らせください。3codebox.com(メールを送信する際には、#を@に置き換えてください。報告を行い、関連する証拠を提供してください。一旦確認がとりついた場合、本サイトは侵害が疑われる内容をすぐに削除します。)