📌  相关文章
📜  用于在 O(n) 时间和 O(1) 额外空间内重新排列正数和负数的Java程序(1)

📅  最后修改于: 2023-12-03 15:11:16.278000             🧑  作者: Mango

用于在 O(n) 时间和 O(1) 额外空间内重新排列正数和负数的Java程序

在编写代码的过程中,有时需要对数组进行重新排列,将正数和负数分别放在数组的两边。本文将介绍一种用于在 O(n) 时间和 O(1) 额外空间内重新排列正数和负数的Java程序。

思路

首先,我们将负数放在数组的前面,正数放在数组的后面。具体方法如下:

  1. 声明两个变量 i 和 j ,分别从数组的两端向中间遍历。
  2. 当 i 所指向的元素为负数,j 所指向的元素为正数时,交换两个元素。
  3. 继续向中间遍历,直到 i 和 j 相遇。

这个过程只需要遍历一遍数组,因此时间复杂度为 O(n) 。同时,我们只需要两个额外的变量 i 和 j ,因此空间复杂度为 O(1) 。

代码

下面是用Java实现上述思路的代码片段:

public static void rearrange(int[] arr, int n) {
    int i = 0, j = n - 1;
    while (i < j) {
        while (i < n && arr[i] >= 0)
            i++;
        while (j >= 0 && arr[j] < 0)
            j--;
        if (i < j) {
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
    }
}
使用方法

要使用上述程序重新排列数组,只需要调用 rearrange 函数并传入待排列的数组,以及数组的长度。

下面是一个使用示例:

public static void main(String[] args) {
    int[] arr = { -1, 3, -2, 4, 5, -6, 7, -8, 9 };
    int n = arr.length;
    rearrange(arr, n);
    System.out.println(Arrays.asList(arr));
}

该程序将打印出一个已经重新排列好的数组。

总结

通过上述程序,我们可以在 O(n) 时间和 O(1) 额外空间内实现对数组的重新排列,将正数和负数分别放在数组的两边。在实际开发中,我们可以应用这个算法来解决一些列问题,例如查找正数或负数的个数、求正数和负数的差值、计算正数或负数的和等。