2013-06-12 4 views
3

Ok, у меня есть массив случайного с некоторыми значениями:Создание нулевых значений из массива в средние существующих значениях

Integer[] array = {null,null,5,111,21,null,22,null,null,null,98,25,47,null,1,23,null} 

Я хочу, чтобы заменить все null значения со средними значениями ближайших два существующих значений массива. Например: первые два значения null необходимо заменить на номер 5 ({null,null,5,... - {5,5,5,...).

Следующий пример: {...,22,null,null,null,98,...} должно быть: {...,22,60,60,60,98,...}; все три значения null должны быть заменены на среднее значение 22 и 98 ((22+98)/2).

Последний пример: {...,23,null} должно быть {...,23,23}; null заменяется на 23, потому что это последний элемент массива.

Есть ли у кого-нибудь идеи, как написать алгоритм для этой проблемы?

+1

Почему ты замените первые два нуля на 5 вместо a verge из ближайших двух существующих значений массива, которые равны 5 и 111? –

+0

@ jwpat7: «два ближайших» следует понимать как два ближайших значения, взятых соответственно слева и справа от нулевого значения. – haylem

+0

@haylem может быть, может быть, нет ... Вопрос просто не достаточно ясен. – m0skit0

ответ

0

Вот мой взгляд на него:

public static void fill(Integer[] newarr, Integer[] arr, int index) { 
    if (arr[index] != null) { 
     newarr[index] = arr[index]; 
     return; 
    } 

    Integer a = null, b = null; 

    int i = index; 
    while (i < arr.length - 1 && (a = arr[++i]) == null); 

    i = index; 
    while (i > 1 && (b = arr[--i]) == null); 

    newarr[index] = (a == null) ? b : (b == null) ? a : (a + b)/2; 
} 

Тогда:

Integer[] arr = { null, null, 5, 111, 21, null, 22, null, null, null, 
     98, 25, 47, null, 1, 23, null }; 

Integer[] newarr = new Integer[arr.length]; 

for (int i = 0; i < arr.length; i++) 
    fill(newarr, arr, i); 

System.out.println(Arrays.toString(newarr)); 
 
[5, 5, 5, 111, 21, 21, 22, 60, 60, 60, 98, 25, 47, 24, 1, 23, 23] 
+0

Downvoter: просьба оставить комментарий. – arshajii

+1

Спасибо, мужик, вот что я искал! –

+0

Без проблем, спасибо еще раз! –

0
  1. определяют все последовательности нуля (магазин начала и конца индекс каждой последовательности)
  2. определение границ элементов для каждой последовательности и среднего caclculate (обязательно обработать дополнительные случаи начала и конец массива правильно)
  3. заменить нуль на вычисленного значения
3

Предполагая, что это делается на ArrayList<Integer>:

//iterate over all values 
for (int i=0; i<array.size(); i++) { 
    //get the value at the current position 
    Integer value= array.get(i); 

    //if the value is null... 
    if (value == null) { 

     //find out the closes left and right values 
     Integer leftValue= goLeft(array, i); 
     Integer rightValue= goRight(array, i); 

     //if both are integer values, find middle 
     if (leftValue != null && rightValue != null) { 
      array.add(i, (leftValue + rightValue)/2); 

     //if left one is integer, and the other one is null? end of the array 
     } else if (leftValue != null && rightValue == null) { 
      array.add(i, leftValue); 

     //if the right one is integer, and the left one is null? begin of the array 
     } else if (leftValue == null && rightValue != null) { 
      array.add(i, rightValue); 

     //well, if everything is null, just add zeros 
     } else { 
      array.add(i, 0); 
     } 
    } 
} 

Что осталось для вас, чтобы реализовать

  • goLeft(ArrayList<Integer> array, int index) и
  • goRight(ArrayList<Integer> array, int index).

Я думаю, что они довольно прямолинейны от контекста и просто смотрят на их имена.

+1

Вы имеете в виду 'Список '. – m0skit0

+0

Да, вы правы. Вы могли бы отредактировать мой пост. – darijan

+0

Я предпочитаю не редактировать других людей ответы на такие вещи, которые на самом деле не являются ошибками. – m0skit0

-1

Другое возможно, проще, но, возможно, менее эффективное решение:

  1. для каждой нулевой проверки левого и правых значения а. если они оба являются числовыми, принимают среднее значение b. если один является нулем и один числовой, установите среднюю до значения, оставьте другой нуль
  2. повтора до тех пор, пока нет обнуляет

Как это работает?

{null,null,5,111,21,null,22,null,null,null,98,25,47,null,1,23,null} 
{null,5 ,5,111,21,21, 22, 22,null,98 ,98,25,47,24 ,1,23,23 } 
{5 ,5 ,5,111,21,21, 22, 22,60 ,98 ,98,25,47,24 ,1,23,23 } 

Среднее значение этих значений будет таким же, и алгоритм проще.

Преимущества

  • ручки начальные/конечные нули без какой-либо модификации
  • меньше памяти требуется

Недостатки

  • делает что-то немного по-другому. ..!
  • может потребоваться несколько итераций
  • в пессимистичном случае потребуется больше времени
+0

Неправильный алгоритм: '22, null, null, null, 98' следует заменить на' 22,60,60,60,98', а не '22,22,60,98,98'. Из OP: * «Следующий пример: {... 22, null, null, null, 98 ...} должен стать: {... 22,60,60,60,98 ...}" *. – m0skit0

+0

@ m0skit0 Вы даже читали мое сообщение? Я сказал это в своем ответе. – Dariusz

+0

Вы заявили, что именно? Что ваш ответ не отвечает на вопрос? – m0skit0

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