C # как определить последнюю итерацию цикла foreach - PullRequest
0 голосов
/ 27 августа 2018

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

Вот код.

private static int solution1(int N)
{
    string binary = Convert.ToString(N, 2);
    int gap = 0;
    int longestgap = 0;

    foreach (char Z in binary)
    {
        if (Z == '0') gap++;
        if (gap > longestgap) longestgap = gap;
        if (Z == '1') gap = 0;
    }
    return longestgap;
}

Ответы [ 2 ]

0 голосов
/ 27 августа 2018

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

if (Z == '0')
{
    gap++;
}
else // if (Z == '1')
{
    if (gap > longestgap)
    {
        longestgap = gap;
    }

    gap = 0;
}

Таким образом, даже если разрыв продолжает отсчитываться до конца вашего двоичного файла, если вы не найдете секунду '1', самый длинный разрыв будет по-прежнему равен 0.

0 голосов
/ 27 августа 2018

Не проверено, но что-то вроде этого должно работать:

bool firstOneFound = false; // To account for the case "00001"
foreach (char Z in binary)
{
    if (Z == '0')
    {
        if(firstOneFound)
            gap++;
    }
    else if (Z == '1')
    {
        if (gap > longestgap)
            longestgap = gap;

        firstOneFound = true;
        gap = 0;
    }
}

Если вам не нужно использовать петлю foreach, это выглядит чище:

 for(int i = binary.IndexOf("1"); i < binary.Length; i++)
 {
     char Z = binary[i];
     if (Z == '0')
     {
         gap++;
     }
     else if (Z == '1')
     {
         if (gap > longestgap)
             longestgap = gap;

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