Нахождение наибольшего разрыва между последовательными числами в массиве Java

#java #arrays #methods

#java #массивы #методы

Вопрос:

В настоящее время я работаю над домашним заданием, и заключительной задачей задания является написание метода для нахождения наибольшего разрыва между последовательными числами в несортированном массиве. Пример: если бы массив имел значения {1,2,3,4,5,20}, разрыв был бы равен 15. В настоящее время массив содержит 20 значений, сгенерированных случайным образом.

Я совершенно не понимаю, как бы я это сделал. Первоначально моя идея о том, как решить эту проблему, заключалась бы в использовании цикла for, который проходит через каждое значение массива с другим циклом внутри, чтобы проверить, равно ли текущее значение предыдущему значению плюс 1. Если это так, то сохраните это число как минимальное в диапазоне. Еще одна проблема, с которой я столкнулся, заключалась в том, что я понятия не имею, как сохранить второе число, не перезаписывая оба числа в диапазоне. В принципе, ничего из того, что я пробовал, не работает, и мне действительно нужна помощь или, по крайней мере, толчок в правильном направлении.

То, что метод делает прямо сейчас, — это сохраняет значение для «a» только после того, как он найдет число, которое не является последовательным в массиве.

Вот код, который у меня есть до сих пор

 import java.util.Arrays;

class Main {
  public static void main(String[] args) {
    Main m = new Main();
    m.runCode();
  }

  public void runCode()
  {
    Calculator calc = new Calculator();

    calc.makeList(20);

    System.out.println("List:");
    calc.showList();

    System.out.println("Max is: "   calc.max());
    System.out.println("Min is: "   calc.min());
    System.out.println("Sum is: "   calc.sum());
  System.out.println("Ave is: "   calc.average());
  System.out.println("There are "   calc.fiftyLess()   " values in the list that are less than 50");
  System.out.println("Even numbers: "   calc.Even());
  }
}

class Calculator {

  int list[] = new int[20];

  public void makeList(int listSize)
  {
    for (int count = 0; count < list.length; count  ) {
      list[count] = (int) (Math.random() * 100);
    }
  }

  public void showList()
  {
    for (int count = 0; count < list.length; count  ) 
    {
      System.out.print(list[count]   " ");
    }
  }

public int max()
{
  int max = list[0];
  for (int count=0; count<list.length; count  ){
     if (list[count] > max) {
        max = list[count];
     }
  }
  return max;
}

public int min()
{
  int min = list[0];
  for (int count=0; count<list.length; count  ){
     if (list[count] < min) {
       min = list[count];
     }
  }
  return min;
 }

 public int sum()
 {
   int sum = 0;
   for (int count=0; count<list.length; count  ){
     sum = sum   list[count];
   }
   return sum;
 }

 public double average()
 {
   int sum = sum();
   double average = sum / list.length;
   return average;
 }

 public int fiftyLess()
 {
   int lessThan = 0;
   for (int count =0; count<list.length;count  )
   {
     if (list[count] < 50)
     {
       lessThan  ;
     }

   }

   return lessThan;

    

 }

 public int Even()
 {
   int isEven = 0;

   for (int count = 0; count<list.length;count  )
   {
     if (list[count] % 2 == 0)
     {
       isEven  ;

     }
   }

   return isEven;
 }

 public int Gap()
 {

  int a = 0;
  int b = 0;
  int gap = math.abs(a - b);
   for (int count = 1; count<list.length;count  )
   {
     if (list[count] != list[count]   1)
     {
      a =list[count];


     }
   }
 }
}
  

Комментарии:

1. Подсказка: i-й разрыв можно найти с list[i 1] - list[i] помощью; запомните самый большой такой разрыв.

Ответ №1:

Используя java8 stream библиотеку, вы могли бы добиться этого за меньшее количество строк кода.

Этот сегмент кода перебирает диапазон массива, вычитает все последовательные числа и возвращает максимальную разницу между ними или -1 , в случае, если массив пуст.

 import java.util.stream.IntStream;

class Main {
    public static void main(String[] args) {
        int[] list = {1, 2, 3, 4, 5, 20};
        int max_difference =
                IntStream.range(0, list.length - 1)
                        .map(i -> Math.abs(list[i   1] - list[i]))
                        .max().orElse(-1);
        System.out.println(max_difference);
    }
}
  

В качестве альтернативы вы могли бы сделать это с помощью традиционного цикла for .

 class Main {
    public static void main(String[] args) {
        int[] list = {1, 2, 3, 4, 5, 20};
        int max_difference = -1;
        int difference;

        for (int i = 0; i < list.length - 1; i  ) {
            difference = Math.abs(list[i   1] - list[i]);
            if(difference > max_difference)
                max_difference = difference;
        }
        System.out.println(max_difference);
    }
}
  

Вывод для обоих сегментов кода:

 15