Необходимо найти ближайшее большее число от заданного

Помогите оптимизировать код , делаю задание в котором на вход подается число и задача найти ближайшее большее составленное из цифр этого же числа , есть юнит тесты, решение вроде сделал, однако возникли проблемы с исключительными ситуациями когда на вход подаются значения отрицательные и значения которые не имеют большего числа (1111,2, 2000 ,int.MaxValue) в последнем выскакивает OverFlowException. Нужно чтобы вводимые отрицательные значения возвращали Argument Exception , а значения которые не имеют большего числа возвращали null.

P.S.Плиз поделитесь , если есть более проще вариант решения этого задания , сам тока обучаюсь и много времени убил чтобы понять что к чему поэтому не судите строго )

public static int? NextBiggerThan(int number)
       {
        string numberstring = number.ToString();
        char[] sNum = numberstring.ToCharArray();
        int lastDigitSeen = sNum[sNum.Length - 1], i, j;
        for (i = sNum.Length - 1; i >= 0; i--)
        {
            if (lastDigitSeen > sNum[i])
            {
                break;
            }
            lastDigitSeen = sNum[i];
        }
        if (i >= 0) 
        {
            for (j = sNum.Length - 1; j > i; j--)
            {
                if (sNum[j] > sNum[i])
                {
                    break;
                }                  
            }

            Swap(sNum, i, j);
            SortSubarray(sNum, i + 1, numberstring.Length - 1);
        }
        else
        {
            return null;
        }

        if (!int.TryParse(new string(sNum), out int result))
        {
          return null; 
        }     

         return result;

        static void Swap(char[] number, int i, int j)
        {
            char temp = number[i];
            number[i] = number[j];
            number[j] = temp;
        }

        static void SortSubarray(char[] number, int i, int j)
        {
            while (i < j)
            {
                Swap(number, i, j);
                i += 1;
                j -= 1;
            }
        }
    }

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

Автор решения: kva52
// Возвращает число ближайшее большее составленное из цифр этого же числа перестановкой цифр
// Алгоритм:
// 1. Формируется массив цифр числа (ch[])
// 2. В цикле переставляем две цифры с индексами i и j, где i меньше j.
// Переставляем только те цифры, которые в результате перестановки сформируют число больше исходного.
// 3. Из всех полученных таким образом чисел выбираем минимальное.
private static int? MyNextBigger(int num)
{
  if (num < 0) throw new ArgumentException("Отрицательный аргумент");
  int result = int.MaxValue;  //результат метода
  char[] ch = num.ToString().ToCharArray();   //массив цифр числа
  for (int i = 0; i < ch.Length; i++)
  {
    for (int j = i + 1; j < ch.Length; j++)
    {
      if (ch[i] >= ch[j]) continue; //перестановка не даст большего числа, пропускаем.
      Swap(ch, i, j); //переставили цифры
      if (int.TryParse(new string(ch), out int newNum)) 
        result = Math.Min(result, newNum);
      Swap(ch, i, j); //переставили обратно цифры
    }
  }
  if (result == int.MaxValue)
    return null;
  return result;
}

Немного покороче. Сравнил результаты вашего и своего методов на входных данных 1111, 2, 2000, 123, int.MaxValue, -12, 12377, 32177, 7177, 0x11. Они совпали. Правда в ваш метод в начале вставил:

  if (number == int.MaxValue) return null;
  if (number < 0) throw new ArgumentException("Отрицательный аргумент");
→ Ссылка