Необходимо найти ближайшее большее число от заданного
Помогите оптимизировать код , делаю задание в котором на вход подается число и задача найти ближайшее большее составленное из цифр этого же числа , есть юнит тесты, решение вроде сделал, однако возникли проблемы с исключительными ситуациями когда на вход подаются значения отрицательные и значения которые не имеют большего числа (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 шт):
// Возвращает число ближайшее большее составленное из цифр этого же числа перестановкой цифр
// Алгоритм:
// 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("Отрицательный аргумент");