簡體   English   中英

將每個零移動到給定整數數組的右側

[英]Moving every zero to the right side of a given array of integers

我試圖將每個零移動到給定整數數組的右側。 但是 while 循環不能正常工作,輸出與輸入數組相同。 我該如何解決? 輸入:[5,4,0,3,2,0,1,7,0] 預期輸出:[5,4,7,3,2,1,0,0,0]

public class Examp167 {
    public static void exchange(int[] array){
        for (int j=0; j<array.length; j++){
            if (array[j]==0){
                while (array[j] != 0) {
                    for (int i=array.length-1; i!=j ; i--) {
                        int temp = array[j];
                        array[j] = array[i];
                        array[i] = temp;
                    }
                }
            }
            System.out.print(array[j]+ " ");
        }
    }
    public static void main(String[] args) {
        int[] a = new int[] {5,4,0,3,2,0,1,7,0};
        exchange(a);
    }
}

我無法提供確切的代碼,但您應該查找荷蘭國旗問題並嘗試從中構建您的解決方案。 它的要點是,每當你看到最右邊的元素0,交換,並移動指針r--如果是有道理的,繼續做,直到你的左指針ll < r

偽代碼將是這樣的

int l = 0; int r = array.size() - 1;
while(l < r) {
 if(array[l] == 0) swap(array[l], array[r--]);
 else l++;
}

它應該可以工作,但我還沒有考慮清楚,它至少應該給你一個解決方法的想法。

下面是它在 Java 中的樣子:

public class Test { 

    public static void exchange(int[] array){
        int l = 0; 
        int r = array.length;
        while (l < r) {
             if(array[l] == 0) {
                 r--;
                 int temp = array[l];
                 array[l] = array[r];
                 array[r] = temp;
             }
             else {
                 l++;
             }
        }
        System.out.println(Arrays.toString(array));
    }

    public static void main(String[] args) {
        int[] a = new int[] {5,4,0,3,2,0,1,7,0};
        exchange(a);
    }
   }

輸出:

[5, 4, 7, 3, 2, 1, 0, 0, 0]

列出的“預期輸出”並不能完全反映說明的內容。 如果您只想將零移到末尾,而不修改其他條目的順序,那么預期的輸出將是“5, 4, 3, 2, 1, 7, 0, 0, 0”,而不是“5 , 4, 7, 3, 2, 1, 0, 0, 0"。 交換方法的以下代碼未修改訂單:

   public static void exchange(int[] array) {
      int l = 0;
      int r = array.length - 1;
      while (l < r) {
         if (array[l] == 0) {
            for (int i = l + 1; i <= r; i++) {
               array[i - 1] = array[i];
            }
            array[r--] = 0;
         }
         else l++; //
      }
      System.out.println(Arrays.toString(array));
   }

如果你不介意創建一個新數組的成本,或者如果你想保持原始數組不變,你可以考慮一個與原始數組大小相同的新數組,因為全新數組的值默認為零,所以您只需要在新數組的開頭放置非零值,而無需在末尾附加零。

private static int[] exchange(int[] a) {
    int[] someArray = new int[a.length];
    int count = 0;
    for (int num : a) {
        if (num != 0) {
            someArray[count] = num;
            count++;
        }
    }
    return someArray;
}

int[] a = new int[] { 5, 4, 0, 3, 2, 0, 1, 7, 0 };
System.out.println(Arrays.toString(exchange(a)));

弄清楚就地,我只是在練習代碼,這才突然出現在我的腦海中,這個問題的 O(1) 空間解決方案! 這個想法與不穩定的代碼非常相似,唯一的區別是,我們不是跟蹤最后一個位置並隨機交換,而是從頭開始跟蹤並以穩定的方式進行,通過確保我們向開頭發送非零值在從左到右的遍歷中。

偽代碼:

for(int lastNonZero = 0, cur = 0; cur < nums.size(); cur++) {
    if(nums[cur] != 0) {
        swap(nums[lastNonZero++], nums[cur]);
     }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM