我正在努力解决这个面试问题。我能够获得具有O(N)空间互补性的O(N)解决方案。我想弄清楚是否有 O(1)空间的解决方案?
问题:
给出一组未排序的正数和负数。创建一个备用正数和负数的数组,不用分别更改正数和负数的相对顺序。
输入:
第一行输入包含一个整数T,表示测试用例的数量。 每个测试用例的第一行是N,N是数组的大小。 每个测试用例的第二行包含N个输入a []。
输出:
打印一组备用正数和负数。 注意:解决方案应以正数开头。
约束:
1≤T≤30 1≤N≤100 -1000≤a[]≤1000
示例:
输入
1
9
9 4 -2 -1 5 0 -5 -3 2
输出
9 -2 4 -1 5 -5 0 -3 2
import java.util.*;
import java.lang.*;
import java.io.*;
class GFG {
public static void main (String[] args) {
//code
Scanner sn = new Scanner(System.in);
int T = sn.nextInt();
for(int i=0; i<T; i++){
int N = sn.nextInt();
ArrayList<Integer> arr = new ArrayList<Integer>();
ArrayList<Integer> pv_arr = new ArrayList<Integer>();
ArrayList<Integer> ne_arr = new ArrayList<Integer>();
for(int j=0; j<N; j++){
int num = sn.nextInt();
if(num<0){
ne_arr.add(num);
}else{
pv_arr.add(num);
}
}
int maxLen = Math.max(pv_arr.size(), ne_arr.size());
for(int k = 0; k < maxLen; k++){
if(k < pv_arr.size()){
System.out.print(pv_arr.get(k) + " ");
}
if(k < ne_arr.size()){
System.out.print(ne_arr.get(k) + " ");
}
}
System.out.println(" ");
}
}
}
我的答案创造了两个阵列正面&amp;否定并交替打印它们。我尝试使用两个指针(一个正值和一个负值)我不知道如何用O(N)&amp; O(1)空间。
答案 0 :(得分:2)
如果您不直接获取数组作为函数的输入,而是必须从标准输入流中读取数字,这意味着您必须创建数组你自己。问题还有:
第一行...... 第二行......
暗示输入是逐行给出的,而不是作为函数的参数。
这意味着最佳解决方案是空间方面的O(n)。您已经找到了一个可行的解决方案,但您仍然可以使用像您自己所说的“指针”方法来简化它:
public static void main (String[] args) {
Scanner sn = new Scanner(System.in);
int T = sn.nextInt();
for(int i=0; i<T; i++){
int N = sn.nextInt();
int[] numbers = new int[N];
int neg_ind = 1;
int pos_ind = 0;
for(int j=0; j<N; j++){
int num = sn.nextInt();
if(num < 0){
numbers[neg_ind] = num;
neg_ind += 2;
}else{
numbers[pos_ind] = num;
pos_ind += 2;
}
}
System.out.println(Arrays.toString(numbers));
}
}