2015-05-01 3 views
0
public class LoopTest { 

    public static void main(String[] args) { 

     int[] myarr = {12, 12, 12, 8, 15, 15}; 

     //Boolean array to mark the elements,defaults false 
     boolean[] b = new boolean[myarr.length]; 

     //Compare Consecutive values and mark them true if equal 
     for (int i = 1; i < myarr.length; i++) { 
      if (myarr[i - 1] == myarr[i]) { 
       b[i - 1] = b[i] = true; 
      } 
     } 
     int sum = 0; 

     //Add all the values in myarr with indices marked as equal 
     for (int i = 0; i < b.length; i++) { 
      if (b[i]) { 
       sum += myarr[i]; 
      } 
     } 

     System.out.println(sum); 


    } 
} 

Выход:Сравнение последовательных элементов в массиве и суммировать те же значения

Пояснение:

12 + 12 + 12 + 15 + 15

Есть ли лучший/более чистый способ сравнить значения в массиве и добавить только значения, если они равны, без использования методов утилиты?

+0

не имеющий предыдущее значение более удобный/чистый подход? – kosa

+0

@Nambari Не могли бы вы предоставить ответ? Я хотел бы видеть подход! – EvenPrime

+0

@Thinkingcap будет идентичными значениями в случайном положении. '[1,2,3,1,2,3,4]'? или всегда как [1,1,1,2,2,3,3,4] –

ответ

0

Вы можете решить это с помощью linear efficiency. Эта программа немного чище и работает во всех условиях, проверяя все краевые случаи . Это приводит к правильному ответу за вашу проблему. Он перемещается по массиву и проверяет, является ли каждый элемент последовательным (тот же, что и предыдущий элемент). Если это так, он добавляет значение элемента к сумме. Крайние случаи должны быть включены в учетную запись для начальных элементов каждого последовательного блока, которые также должны быть добавлены к сумме.

private static int consecutiveCompare(int[] array) 
{ 
    int sum = 0; 

    for (int i = 1; i < array.length; i++) 
    { 
     if (array[i] == array[i-1]) 
     { 
      if (i == 1) 
      { 
       sum += array[i]; 
      } 
      else if (array[i] != array[i-2]) 
      { 
       sum += array[i]; 
      } 
      sum += array[i]; 
     } 
    } 

    return sum; 
} 
+0

Вам действительно нужно i> 0 в крайнем случае, если? Не можете ли вы запустить цикл for с i = 1 – EvenPrime

+0

@Thinkingcap Конечно, я мог бы сэкономить сравнение. –

+0

Ваше решение простое, с другим избыточным сравнением 'array [i] == array [i-1]', оно должно быть 'else if (array [i]! = Array [i-2])', вы уже проверяя это условие для начала! – EvenPrime

1

Вы можете сохранить счетчик повторяющихся предметов и добавить их в sum, когда закончится бег.

int[] myarr = {12, 12, 12, 8, 15, 15}; 
// assumes > 0 length 
int count = 1; 
int sum = 0; 
for (int i = 1; i < myarr.length; i++) { 
    if (myarr[i] == myarr[i - 1]) { 
     count++; 
    } else { 
     if (count > 1) { 
      sum += count * myarr[i - 1]; 
     } 
     count = 1; 
    } 
} 
// handle if last elements are duplicates 
if (count > 1) { 
    sum += count * myarr[myarr.length - 1]; 
} 
System.out.println(sum); 
+2

Пожалуйста, объясните, почему этот ответ заслуживает понижения? – mkobit

+2

Это работает, не знаю, почему он был занижен! – EvenPrime

1

Следующий код будет работать:

public class LoopTest { 
    public static void main(String[] args) { 
     int[] myarr = {12, 12, 12, 8, 15, 15}; 
     int sum = 0; 
     int occ = 1; 
     for (int i = 1; i < myarr.length; i++) { 
      if (myarr[i - 1] == myarr[i]) { 
       occ++; 
      } else { 
       if (occ > 1) { 
        sum += (occ * myarr[i - 1]); 
       } 
       occ = 1; 
      } 
      if (i == myarr.length - 1) { 
       if (occ > 1) { 
        sum += (occ * myarr[i - 1]); 
       } 
      } 
     } 
     System.out.println(sum); 
    } 
} 
+0

Хороший подход, но вам не нужен 'if (i == myarr.length-1)' внутри цикла, обратитесь к @MikeKobit answer – EvenPrime

0

Не проверял все крайние случаи, вот что у меня есть в моем сознании:

public class LoopTest { 

    public static void main(String[] args) { 

     int[] myarr = {1,1,1,2,2,3,3,4}; 

     //Boolean array to mark the elements,defaults false 
     boolean[] b = new boolean[myarr.length]; 

     //Last value tracker. 
     int lastVal = myarr[0]; 
     //Count occurrences in a sequence. 
     int cntr = 1; 
     //Sum counter. 
     int sum = 0; 
     //Compare Consecutive values and mark them true if equal 
     for (int i = 1; i < myarr.length; i++) { 
      if (myarr[i] == lastVal) { 
       cntr++; 
       //If last sequence mathching. 
       if (i == myarr.length-1) { 
        sum += lastVal * cntr; 
       } 
      } else { 
       if (cntr > 1) { 
        sum += lastVal * cntr; 
        //Reset counter. 
        cntr = 1; 
       } 
       lastVal = myarr[i]; 
      } 
     } 
     System.out.println(sum); 
    } 
} 
Смежные вопросы