Алгоритм определения максимальной возрастающей последовательности в массиве - PullRequest
0 голосов
/ 16 апреля 2020

Я прохожу языковой курс C в Coursera, где я натолкнулся на задание, в котором просил меня написать фрагмент кода, который мог бы рассказать о максимальной возрастающей последовательности в массиве. Например, для массива {3,5,0,7,8,9} он должен вернуть мне три как максимум. Я написал две части кода, которые, как я полагаю, должны быть в состоянии пройти. Однако, только один из них сделал, и я не мог понять, почему.

Вот первый фрагмент кода, который проходит:

#include <stdio.h>
#include <string.h>
size_t maxSeq(int*array, size_t n){
  size_t maxLength = 0;
  size_t counter = 1;
  if(n == 0){
    return maxLength;
  }
  if(n == 1){
    maxLength = 1;
    return maxLength;
  }
  for(int i = 1;i < n;i++){
    if((array[i]-array[i-1])>0){
      counter += 1;
    }else{
      if(maxLength < counter){
        maxLength = counter;
      }
      counter = 1;
    }
  }
  if(maxLength < counter){
    maxLength = counter;
  }
  return maxLength;
}

А вот второй фрагмент кода, который не прошло:

#include <stdio.h>
#include <string.h>
size_t maxSeq(int*array, size_t n){
  int maxLength = 0;
  int counter = 1;
  if( n== 0){
    return maxLength;
  }
  if(n == 1){
    maxLength = 1;
    return maxLength;
  }
  for(size_t i = 1;i < n;i++){
    if((array[i]-array[i-1])>0){
      counter += 1;
      if(counter >= maxLength){
        maxLength = counter;
      }
    }else if((array[i]-array[i-1])<=0){
      counter = 1;
    }
  }
  return maxLength;
}

1 Ответ

1 голос
/ 16 апреля 2020

Два кода по существу эквивалентны, и оба дают мне правильный ответ (4, а не 3) для примера ввода.

Различия типов между n, counter, maxLength и i создают неприятный запах кода, и они могут фактически привести к сбою обоих кодов на входах, длина которых не может быть представлена ​​типом int. Однако это вряд ли является проблемой, которую испытывал тестер, учитывая, что первый код пройден.

Основная проблема со вторым кодом заключается в том, что он выдает неверный результат (0) для входных массивов, которые не возрастающий, такой, что максимальные строго увеличивающиеся подпоследовательности имеют длину 1. Причина, по которой это так, оставлена ​​в качестве упражнения. Если у вас возникли проблемы с его выяснением только после чтения кода, подумайте об использовании отладчика для подробного отслеживания выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...