| English | 意味 |
|---|---|
| shift/ʃɪft/ | シフト |
| delete/dɪˈliːt/ | 削除 |
| insert/ˈɪnsɜːt/ | 挿入 |
Adjacent removals reveal a skipped element
- Starting with
[0, 0, 5], remove index 0 and then increment i. The second zero has shifted into index 0, so that forward loop skips it and leaves[0, 5]. - For the forward while-loop taught here, stay at the same index after removal and advance only when keeping an element. It then removes both zeros and finishes with
[5].
Keep the current forward index after removal
- After
remove(i), every later element shifts one place left. If an element now occupies i, it has not yet been checked; inspect it on the next iteration. - The loop below accepts a non-null list of non-null Integers and removes every zero in place. It uses current size each iteration and performs no get call on an empty list.
import java.util.ArrayList;
public class RemoveZeros {
public static void removeZeros(ArrayList<Integer> list) {
int i = 0;
while (i < list.size()) {
if (list.get(i) == 0) {
list.remove(i);
} else {
i++;
}
}
}
}
Explain why this loop terminates
- Each iteration either removes one element and reduces size, or keeps one and increases i. Thus
size() - i, the number of positions still to check, decreases by one each iteration. - Starting with
[0, 0, 5], the states are[0, 5]at i=0,[5]at i=0, then[5]at i=1. The final condition is false, so no out-of-bounds access occurs.
A backward loop follows a different rule
- A reverse loop starts at the final existing index:
for (int i = list.size() - 1; i >= 0; i--). Remove matching elements withremove(i); the next i is always one lower. - Deleting at i shifts only later indices, which have already been checked. Earlier unchecked elements retain their indices, so decrementing after a removal is correct here; “never advance after removal” is not a universal rule.
Choose an index update that matches the direction of traversal. In the forward while-loop, stay after removal; in the backward for-loop, continue decrementing. Direct structural changes during an enhanced loop are a separate unsafe pattern, even when no fail-fast exception appears.
ここで示す前方whileループにおいて、i を進めるのは...場合のみです。
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
remove(i)後、次の要素がiにシフトするため、それを飛ばさないでください。
[0, 0, 5] に対する単純な前方ループで i=0 で削除してその後 i を増やすと、次のゼロをスキップします。
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
残りのゼロはインデックス 0 に移動しますが、次のテストはインデックス 1 で行われます。後方ループは異なる正しいインデックス規則を使用します。
シフトを回避する在PLACE削除の代替案として...を行うことができます。
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
保持要素を新しいリストに追加することでシフトを回避できます。
ArrayListアルゴリズムは...を介して配列パターンを再利用します。
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
配列の[]とlengthをget(i)とsize()に置き換えます。
可変長のArrayListは固定配列とは異なり、要素の挿入と削除が可能です。
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
addとremoveはリストのサイズを変更します。
size()-1 から始まる後方削除ループは、各削除後に同じインデックスに留まっています。
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
False: 未確認の要素は元のインデックスを維持するため、後方ループは通常通り減算されます。
Build a new list when the original must remain
- To preserve the original list, create a fresh result and append every nonzero element while reading the original. This keeps the original sequence and its size unchanged; it uses additional list storage.
- For lists of mutable objects, copying retained references does not clone those objects. A new list structure may still share its element objects with the original; distinguish list identity from element identity.
前方削除では、削除後にインデックスが維持されます。
インデックス 0 で隣接する2つのゼロがチェックされ、その後に 5 が保持される。
Check the cases that expose the algorithm
- Test an empty list, all zeros, no zeros, adjacent zeros and a zero at the last index. For in-place removal, other references to the same list observe its change; a fresh result leaves that original structure intact.
- An ArrayList can insert 插入 or delete 删除 elements; those operations can shift 移位 later indices. A search may return a found index or -1 when absent; a maximum requires an explicit empty-list policy. Reusing array patterns through get/size helps, but each algorithm still needs its own bounds and contract.
Removing shifts indices. Explain which elements remain unchecked and choose the next index accordingly. Forward stay-or-increment and backward decrement are both valid patterns; a fresh list of keepers preserves the original structure but may share objects.
Order the states for the corrected removal loop on [0, 0, 5].
難易度 3/5 · 200 コイン + 今日初回完了時に小ボーナス付与
Each removal rechecks the shifted value; keeping 5 finally advances the index.
空のリストに対して、示された前方 removeZeros メソッドは get 呼び出しをいくつ行いますか?
難易度 2/5 · 140 コイン + 今日初回完了時に小ボーナス付与
初期条件 0 < 0 は偽であるため、get メソッドの呼び出しは発生しない。