Первая серия чисел всегда самая большая

Пробую решить задачу:

найдите наибольшее количество идущих подряд цифр

Не могу понять в чем ошибка моего кода, вечно выдаёт что первая серия чисел самая большая. Подскажите пожалуйста в чём ошибка!

string s = "kabab23hzjz782134218jss8";
string num = "123456789";
int max = 0, count = 0;
 
for (int i = 0; i < s.Length; i++)
{
  for(int j = 0;j < num.Length; j++)
  {
     if (s[i] == num[j])
     {
        count++;
     
        if (count > max)
            max = count;
     }
     else
     {
      count = 0;
     }
  }
}
 
Console.WriteLine(max);
Console.ReadKey();

Ответы (1 шт):

Автор решения: A K

Ваша ошибка в том, как вы проверяете является ли текущий char цифрой. Используйте готовый метод Char.IsDigit:

public int MaxDigitLength(string source)
{
    int result = 0;
    int resultMax = 0;

    for (int i = 0; i < source.Length; i++)
    {
        if(Char.IsDigit(source[i]))
        {
            result++;
            if(result > resultMax)
            {
                resultMax = result;
            }
        }
        else
        {
            result = 0;
        }
    }
    return resultMax;
}

Если по условию вам нельзя использовать готовый метод IsDigit -- напишите свой, отдельно:

public bool IsDigit(char c)
{
    return c >= '0' && c <= '9';
}

Ваша же методика (если вы очень хотите сделать именно так) должна быть такой:

public bool IsDigit(char c)
{
    string nums = "0123456789";
    for (int i = 0; i < nums.Length; i++)
    {
        if(nums[i] == c)
            return true;
    }
    
    return false;
}

Но из-за того, что вы не разделили на отдельные методы у вас произошло некорректное слияние обхода строки s и обхода num. Очень хорошо оберегает от подобных ошибок соблюдение принципа единственной ответственности (SRP) из SOLID.

Вот как должен был выглядеть итоговый алгоритм для вашего варианта:

string s = "kabab23hzjz782134218jss8";
string num = "0123456789";
int max = 0, count = 0;

for (int i = 0; i < s.Length; i++)
{
    bool isDigit = false;
    
    for (int j = 0; j < num.Length; j++)
    {
        if (s[i] == num[j])
        {
            isDigit = true;
            break;
        }
    }

    if (isDigit)
    {
        count++;

        if (count > max)
            max = count;
    }
    else
    {
        count = 0;
    }
}

Console.WriteLine(max);

PS В принципе, проверка return c >= '0' && c <= '9' не даёт прям резкого буста по скорости по сравнению с string nums = "0123456789";, несмотря на наличие вложенного for общая сложность так и остаётся O(N), потому что строка nums не растёт с ростом строки s, но просто такая запись более короткая и понятная.

→ Ссылка