Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public static long NextBiggerNumber(long n)
- {
- var numbersInN = NumbersIn(n);
- var pviotIndex = FindPivotIndex(numbersInN);
- if (pviotIndex == -1) return -1;
- var smallestNumberIndexAfterPivot = FindSmallestIndexAfterPivot(pviotIndex, numbersInN);
- Swap(numbersInN, pviotIndex, smallestNumberIndexAfterPivot);
- Sort(pviotIndex,numbersInN);
- return ConvertListToLong(numbersInN);
- }
- public static List<long> NumbersIn(long value)
- {
- if (value == 0) return new List<long>();
- var numbers = NumbersIn(value / 10);
- numbers.Add(value % 10);
- return numbers;
- }
- public static int FindPivotIndex(List<long> numbers)
- {
- for (var i = numbers.Count - 1; i > 0; i--)
- {
- if (numbers[i] > numbers[i-1]) return i-1;
- }
- return -1;
- }
- public static void Swap<T>(IList<T> list, int indexA, int indexB)
- {
- T tmp = list[indexA];
- list[indexA] = list[indexB];
- list[indexB] = tmp;
- }
- public static long ConvertListToLong(List<long> list)
- {
- long total = 0;
- foreach (long entry in list)
- {
- total = 10 * total + entry;
- }
- return total;
- }
- private static int FindSmallestIndexAfterPivot(int pivot, List<long> numbers)
- {
- var smallestNumberIndexAfterPivot = pivot + 1;
- for (var i = pivot + 1; i < numbers.Count; i++)
- {
- if (numbers[i] < numbers[smallestNumberIndexAfterPivot] && numbers[i] > numbers[pivot])
- {
- smallestNumberIndexAfterPivot = i;
- }
- }
- return smallestNumberIndexAfterPivot;
- }
- private static void Sort(int pviotIndex, List<long> numbers)
- {
- bool sorted = false;
- while (!sorted)
- {
- sorted = true;
- for (var i = pviotIndex + 1; i < numbers.Count; i++)
- {
- var compareIndex = i+1;
- if (compareIndex >= numbers.Count) break;
- if (numbers[i] > numbers[compareIndex])
- {
- Swap(numbers, i, compareIndex);
- sorted = false;
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement