2015-02-03 3 views
0

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

У меня есть список чисел, которые получают доступ к методу класса во время каждой итерации цикла for. Эти цифры могут быть положительными или отрицательными, и нет четкого способа узнать, что последует за этим. Мне нужен алгоритм, чтобы он мог вычислять в реальном времени (во время выполнения цикла) непрерывное последовательное отрицательное число. Таким образом, в конце итерации цикла число, хранящееся в consecutiveNegative, будет целым числом, показывающим наибольшие последовательные времена, за которым после отрицательного числа следовало другое отрицательное число.

Ниже то, что я пытался, но он не работает ...

class Temp 
{ 
    public int consecutiveNegative = 0; 
    private bool previousNegative = false; 


    public void iterCall(int x) 
    { 
     if(x > 0) 
     { 
      if(previousNegative == true) 
      { 
       consecutiveNegative = 0; 
      } 
      previousNegative = false; 

     } 
     else if (x < 0) 
     { 
      if (previousNegative == false) 
      { 
       consecutiveNegative = consecutiveNegative + 1; 
      } 
      previousNegative = true; 
     } 
    } 


} 

Любые указатели?


Ниже приведен код, чтобы люди начали возиться.

Temp classTmp = new Temp(); 
List<int> nums = new List<int>(); 
nums.Add(1); 
nums.Add(-1); 
nums.Add(1); 
nums.Add(-1); 
nums.Add(-1); 
nums.Add(-1); 
nums.Add(1); 
nums.Add(-1); 
nums.Add(-1); 
nums.Add(1); 

for(int i = 0; i < nums.Count;i++) 
{ 
    classTmp.iterCall(nums[i]); 
} 

classTmp.consecutiveNegative должно быть 3 после того, как она завершает цикл.

+0

Не могли бы вы включить пример проблемы? Каким образом предлагаемый код не работает? – Codor

+0

Ваш 'if (x <0)' неверен - что произойдет, если 'x <0' и' previousNegative == true'? –

+0

см. Новый код, я сделал пример с игрушкой. Ответ должен быть 3, так как в этой серии вы видите максимальное число последовательных -1 равно 3. – user1234440

ответ

1

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

Math.Max(ConsecutiveNegative,CurrentConsecutiveNegative) 

как последовательность не может быть прервана.

class Temp 
{ 
    public int CurrentCosecutiveNegative = 0; 
    public int ConsecutiveNegative = 0; 

    public void iterCall(int x) 
    { 
     if(x >= 0) 
     { 
      ConsecutiveNegative 
       = Math.Max(ConsecutiveNegative,CurrentConsecutiveNegative); 
      CurrentConsecutiveNegative = 0; 
     } 
     else 
     { 
      CurrentConsecutiveNegative++; 
     } 
    } 
} 
+0

Хм, похоже, что это не работает с моим примером – user1234440

+0

Желаемый результат - 3, не так ли? – Codor

+0

nevermind Я получил его – user1234440

1

Вам нужен maxNegative, чтобы следить за текущие затяжные последовательные отрицания. Кроме того, ваша логика была ошибочной в вашем случае x < 0: во второй раз это было отрицательно, это не увеличило бы количество.

class Temp 
    { 
     public int consecutiveNegative = 0; 
     public int maxNegative = 0; 

     public void iterCall(int x) 
     { 
      if (x > 0) 
      { 
       consecutiveNegative = 0; 
      } 
      else if (x < 0) 
      { 
       consecutiveNegative += 1; 
       if (maxNegative < consecutiveNegative) 
        maxNegative = consecutiveNegative; 
      } 
     } 
    } 

Как показал @Codor, используя этот подход, вам не нужно логическое значение, чтобы следить за предыдущий номер, потому что consecutiveNegative будет сброшен автоматически.

+0

В вашем решении переменная 'previousNegative' никогда не читается. – Codor

+0

Хороший звонок, мне это не нужно – Jonesopolis

1

Вам нужно 2 вары один для самой большой последовательности негативов, а другой для текущей длины последовательности:

class Temp 
{ 
    public int consecutiveNegative = 0; 
    public int curConsecutiveNegatives = 0; 

    public void iterCall(int x) 
    { 
     if (x < 0) 
      consecutiveNegative = Math.Max(consecutiveNegative, ++curConsecutiveNegatives); 
     else 
      curConsecutiveNegatives = 0; 

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