記事ディレクトリ
[トピックカテゴリ] 1 つ
- ダブルポインタ
2【問題難易度】
- 単純
3 [トピック番号]
- 283. ムービングゼロ
4 【タイトル説明】
- 配列 nums を指定して、ゼロ以外の要素の相対的な順序を維持しながら、すべての 0 を配列の末尾に移動する関数を作成します。
- 配列はコピーせずにその場で操作する必要があることに注意してください。
5つの【話題例】
-
例 1:
- 入力: 数値 = [0,1,0,3,12]
- 出力: [1,3,12,0,0]
-
例 2:
- 入力: 数値 = [0]
- 出力: [0]
6つの【問題解決アイデア】
- タイトルは、値がゼロの要素を配列の後ろに置くというものですが、考え方を変えて、ゼロではない要素を相対的な順序で配列の先頭に置きます。
- 上記の考え方に基づいて、i と j という 2 つのポインターを定義できます。
- i ポインタ: 配列内のゼロ以外の値を見つけるために使用されます。
- j ポインタ: 配列内の最初のゼロ位置を指します。
- 配列全体を走査し、i ポインターがゼロ以外の値に遭遇した場合は、それを j ポインターと交換します。j ポインターは常に配列内の最初のゼロの位置を指すため、直接交換すると、配列内のゼロ以外の要素が置き換えられます。 array 相対的な順序で配列の前に置きます
- 交換後、j ポインタは 1 位置戻り、次のゼロ位置を指し、次の交換に備えます。
- i ポインタはゼロ以外の値を検索し続けます。
- この質問には戻り値は必要ありません
7 [タイトルプロンプト]
- 1 < = 数値。長さ < = 1 0 4 1 <= nums.length <= 10^{4}1<=数値。_ _ _ 長さ_ _ _ _<=1 04
- − 2 31 < = nums [ i ] < = 2 31 − 1 -2^{31} <= nums[i] <= 2^{31} - 1− 231<=数値[ i ] _ _ _<=231−1
8 [上級トピック]
- 実行される操作の数を最小限に抑えることはできますか?
9 [時間頻度]
- 時間計算量: O ( n ) O(n)O(n),其中 n n nは受信配列の長さです
- 空間複雑さ: O ( 1 ) O(1)○ (1)
10 [コード実装]
- Java言語バージョン
class Solution {
public void moveZeroes(int[] nums) {
for(int i = 0,j=0;i<nums.length;i++){
if(nums[i] != 0){
int temp = nums[i];
nums[i] = nums[j];
nums[j++] = temp;
}
}
}
}
- C言語版
void moveZeroes(int* nums, int numsSize)
{
for(int i = 0,j=0;i<numsSize;i++)
{
if(nums[i] != 0)
{
int temp = nums[i];
nums[i] = nums[j];
nums[j++] = temp;
}
}
}
- Python言語バージョン
class Solution:
def moveZeroes(self, nums: List[int]) -> None:
j = 0
for i in range(0,len(nums)):
if nums[i] != 0:
temp = nums[i]
nums[i] = nums[j]
nums[j] = temp
j += 1
- C++言語バージョン
class Solution {
public:
void moveZeroes(vector<int>& nums) {
for(int i = 0,j=0;i<nums.size();i++)
{
if(nums[i] != 0)
{
int temp = nums[i];
nums[i] = nums[j];
nums[j++] = temp;
}
}
}
};
イレブン【提出結果】
-
Java言語バージョン
-
C言語版
-
Python言語バージョン
-
C++言語バージョン