拆分+ ve和-ve nums数组

时间:2016-11-14 16:30:36

标签: algorithm

我正在努力解决这个面试问题。我能够获得具有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)空间。

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));
    }
}