📅  最后修改于: 2023-12-03 15:11:16.278000             🧑  作者: Mango
在编写代码的过程中,有时需要对数组进行重新排列,将正数和负数分别放在数组的两边。本文将介绍一种用于在 O(n) 时间和 O(1) 额外空间内重新排列正数和负数的Java程序。
首先,我们将负数放在数组的前面,正数放在数组的后面。具体方法如下:
这个过程只需要遍历一遍数组,因此时间复杂度为 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) 额外空间内实现对数组的重新排列,将正数和负数分别放在数组的两边。在实际开发中,我们可以应用这个算法来解决一些列问题,例如查找正数或负数的个数、求正数和负数的差值、计算正数或负数的和等。