Advertisement
Guest User

Untitled

a guest
Dec 13th, 2019
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 1.92 KB | None | 0 0
  1.     public static long NextBiggerNumber(long n)
  2.     {    
  3.       var numbersInN = NumbersIn(n);
  4.         var pviotIndex = FindPivotIndex(numbersInN);
  5.         if (pviotIndex == -1) return -1;
  6.  
  7.         var smallestNumberIndexAfterPivot = FindSmallestIndexAfterPivot(pviotIndex, numbersInN);
  8.         Swap(numbersInN, pviotIndex, smallestNumberIndexAfterPivot);
  9.         Sort(pviotIndex,numbersInN);
  10.         return ConvertListToLong(numbersInN);
  11.     }
  12.    
  13.         public static List<long> NumbersIn(long value)
  14.     {
  15.       if (value == 0) return new List<long>();
  16.       var numbers = NumbersIn(value / 10);
  17.       numbers.Add(value % 10);
  18.       return numbers;
  19.     }
  20.    
  21.     public static int FindPivotIndex(List<long> numbers)
  22.     {
  23.         for (var i = numbers.Count - 1; i > 0; i--)
  24.         {
  25.             if (numbers[i] > numbers[i-1]) return i-1;
  26.         }
  27.         return -1;
  28.     }
  29.    
  30.     public static void Swap<T>(IList<T> list, int indexA, int indexB)
  31.     {
  32.         T tmp = list[indexA];
  33.         list[indexA] = list[indexB];
  34.         list[indexB] = tmp;
  35.     }
  36.    
  37.     public static long ConvertListToLong(List<long> list)
  38.     {
  39.         long total = 0;
  40.         foreach (long entry in list)
  41.         {
  42.             total = 10 * total + entry;
  43.         }
  44.         return total;
  45.     }
  46.    
  47.     private static int FindSmallestIndexAfterPivot(int pivot, List<long> numbers)
  48.     {
  49.         var smallestNumberIndexAfterPivot = pivot + 1;
  50.         for (var i = pivot + 1; i < numbers.Count; i++)
  51.         {
  52.             if (numbers[i] < numbers[smallestNumberIndexAfterPivot] && numbers[i] > numbers[pivot])
  53.             {
  54.                 smallestNumberIndexAfterPivot = i;
  55.             }
  56.         }
  57.         return smallestNumberIndexAfterPivot;
  58.     }
  59.    
  60.     private static void Sort(int pviotIndex, List<long> numbers)
  61.     {
  62.         bool sorted = false;
  63.         while (!sorted)
  64.         {
  65.             sorted = true;
  66.             for (var i = pviotIndex + 1; i < numbers.Count; i++)
  67.             {
  68.                 var compareIndex = i+1;
  69.                 if (compareIndex >= numbers.Count) break;
  70.                 if (numbers[i] > numbers[compareIndex])
  71.                 {
  72.                     Swap(numbers, i, compareIndex);
  73.                     sorted = false;
  74.                 }
  75.             }
  76.         }
  77.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement