它在示例 [0,0,1] 處失敗,輸出為 [0,1,0] 而不是 [1,0,0]。我在除錯模式下瀏覽過代碼,當p1變為0時,它跳出for回圈,我不明白為什么,因為它應該再回圈一次,然后遞減到-1并退出回圈.
給定一個整數陣列 nums,將所有 0 移動到它的末尾,同時保持非零元素的相對順序。請注意,您必須在不復制陣列的情況下就地執行此操作。
示例 1:
輸入:nums = [0,1,0,3,12] 輸出:[1,3,12,0,0]
示例 2:
輸入:nums = [0] 輸出:[0]
package random.leetCode;
import java.util.Arrays;
public class MoveZeroes_TwoPointers_283 {
public void moveZeroes(int[] nums) {
int p2 = 0;
int tempIndex = 0;
int lastIndex = nums.length - 1;
for (int p1 = nums.length - 1; p1>=0; p1--)
{
if (nums[p1] == 0)
{
if (p1 == nums.length - 1 && nums.length == 1)
{
break;
}
tempIndex = p1;
p2 = p1 1;
while (p2 <= lastIndex)
{
int temp = nums[p1];
nums[p1] = nums[p2];
nums[p2] = temp;
p2 = 1;
p1 = 1;
}
p1 = tempIndex -1;
lastIndex--;
}
}
}
public static void main(String[] args) {
MoveZeroes_TwoPointers_283 example = new MoveZeroes_TwoPointers_283();
// int[] numbersToBeSorted = new int[]{0,1,0,3,12,0,11,0,0};
// int[] numbersToBeSorted = new int[]{0};
// int[] numbersToBeSorted = new int[]{0,0};
// int[] numbersToBeSorted = new int[]{1};
// int[] numbersToBeSorted = new int[]{1,1};
int[] numbersToBeSorted = new int[]{0,0,1};
example.moveZeroes(numbersToBeSorted);
System.out.println(Arrays.toString(numbersToBeSorted));
}
}```
uj5u.com熱心網友回復:
for (int p1 = nums.length - 1; p1>=0; p1--) {
...
tempIndex = p1;
...
p1 = tempIndex -1;
}
您在此回圈中將 p1 遞減兩次。你可能不是故意的。
uj5u.com熱心網友回復:
有趣的。我認為問題在于當您找到兩個連續的零并管理這些指標時。讓我知道你對這個演算法的看法。
void main() {
int[] input = new int[]{0,0,1};
// whenever finds a zero, move it to the end
for (int i=0; i < input.length; i ) {
if (input[i] == 0) moveToEnd(i, input);
}
System.out.println(input);
}
// move to the end by swapping elements
void moveToEnd(pos, arr) {
for (int i = pos 1; i < arr.length; i ) {
int aux = arr[pos];
arr[pos] = arr[i];
arr[i] = aux;
post = i;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/410869.html
標籤:
