2016-11-14 2 views
0

Я пытаюсь решить эту проблему для интервью. Я смог получить решение O (N) с пространственной полнотой O (N). Я пытаюсь выяснить, есть ли решение с O (1) пространство?Сплит-массив + ve и -ve nums

Вопрос:

Учитывая несортированный массив положительных и отрицательных чисел. Создайте массив альтернативных положительных и отрицательных чисел без, изменяя относительный порядок положительных и отрицательных чисел соответственно.

Входной сигнал:

Первая строка входного файла содержит целое число T, обозначающее количество тестов. Первая строка каждого тестового примера - N, N - размер массива. Вторая строка каждого тестового примера содержит N ввода a [].

Выход:

печати массив альтернативных положительных и отрицательных чисел. Примечание: Решение должно начинаться с положительного числа.

Ограничения:

1 ≤ T ≤ 30 1 ≤ N ≤ 100 -1000 ≤ в [] ≤ 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(" "); 
     } 
    } 
} 

Мой ответ создает два массива положительных & отрицательна и печатает их в качестве альтернативы. Я попытался использовать два указателя (один из положительных значений и один из отрицательных значений). Я не уверен, как решить это с помощью O (N) & O (1) пространства.

+0

Гарантировано ли, что есть решение? То есть существует одинаковое число отрицательных и положительных целых чисел (или самое большее на 1). – luk32

+0

Я не уверен, есть ли решение для O (N) времени и сложности O (1). Я просто пытался найти оптимальный способ решить эту проблему. –

+0

Я имею в виду решение проблемы. То есть Ввод 1 5 1 1 1 1 1 кажется недействительным. – luk32

ответ

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

А хорошо. Я чувствую себя глупо: P. Большое спасибо @keiwan –

+0

Но это действительно 'O (n)' космическая сложность. Потому что вопрос ** требует ** создания массива. И это не может считаться дополнительным пространством. Если бы вы как-то прочитали его в массив, а затем создали новый массив, а затем применили логику в своем коде, тогда это будет 'O (n)' space. – thebenman

+0

@ thebenman Я понимаю, что вы имеете в виду, но я бы сказал, что это решение 'O (n)', потому что вопрос требует, чтобы оно было решением «O (n)». Поскольку вход не задан как массив, а как поток чисел, который вы должны превратить в массив, это дополнительное пространство и, следовательно, добавляет к сложности пространства. – Keiwan

Смежные вопросы