Advertisement
yarin0600

yuvalAmaniuk2

Nov 23rd, 2023
790
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.28 KB | None | 0 0
  1. #include <iostream>
  2. #include <cmath>
  3.  
  4. bool solution(int *arr, int size);
  5. bool checkIfPossibleToGenEditedNumberBiggerThanLeftSmallerThanRightBySwappingTwoDigits(int *arr, int size,
  6.                                                                                        int leftToEditedNumberIdx, int editedNumberIdx, int rightToEditedNumberIdx);
  7. int generateNewNumberBySwappingTwoDigits(int number, int chosenDigitToSwapFromRight, int chosenDigitToSwapWithFromRight);
  8. int pow(int num, int toPower);
  9.  
  10. int main()
  11. {
  12.    int arr[] = {13, 31, 30};
  13.    int size = sizeof(arr) / sizeof(*arr);
  14.    std::cout << solution(arr, size) << std::endl;
  15. }
  16.  
  17. bool solution(int *arr, int size)
  18. {
  19.    int counterOfBreaksToMakeArrayAscending = 0;
  20.    for (int i = 1; i < size; ++i)
  21.    {
  22.       if (arr[i] <= arr[i - 1])
  23.          ++counterOfBreaksToMakeArrayAscending;
  24.    }
  25.    // Three Cases:
  26.    // Case A: it's already ascending array
  27.    if (counterOfBreaksToMakeArrayAscending == 0)
  28.       return true;
  29.    // Case B: There has to be more than one swaps [between number digits] to make it happen, if it even could
  30.    if (counterOfBreaksToMakeArrayAscending > 1)
  31.       return false;
  32.  
  33.    // Case C: That's MAYBE possible - we need to find the three numbers that are making it happen and make sure it can be done
  34.    int leftToEditedNumberIdx = -1;
  35.    int editedNumberIdx = -1;
  36.    int rightToEditedNumberIdx = -1;
  37.  
  38.    for (int i = 0; i < size; ++i)
  39.    {
  40.       // left side of the condition will happen for sure only when the x y z are [...,x,y,]z
  41.       if (i < size - 1 && arr[i] >= arr[i + 1])
  42.       {
  43.          leftToEditedNumberIdx = i - 1;
  44.          editedNumberIdx = i;
  45.          rightToEditedNumberIdx = i + 1;
  46.          break;
  47.       }
  48.    }
  49.    return checkIfPossibleToGenEditedNumberBiggerThanLeftSmallerThanRightBySwappingTwoDigits(arr, size,
  50.                                                                                             leftToEditedNumberIdx,
  51.                                                                                             editedNumberIdx,
  52.                                                                                             rightToEditedNumberIdx);
  53. }
  54.  
  55. bool checkIfPossibleToGenEditedNumberBiggerThanLeftSmallerThanRightBySwappingTwoDigits(int *arr, int size,
  56.                                                                                        int leftToEditedNumberIdx, int editedNumberIdx, int rightToEditedNumberIdx)
  57. {
  58.    int lengthOfNumber = log10(arr[editedNumberIdx]);
  59.    int numToEdit = arr[editedNumberIdx];
  60.    int leftNumber = leftToEditedNumberIdx != -1 ? arr[leftToEditedNumberIdx] : INT_MIN;
  61.    int rightNumber = rightToEditedNumberIdx != size ? arr[rightToEditedNumberIdx] : INT_MAX;
  62.  
  63.    int editedNumber = -1;
  64.    for (int i = 0; i <= lengthOfNumber; ++i)
  65.    {
  66.       for (int j = 0; j <= lengthOfNumber; ++j)
  67.       {
  68.          if (i != j)
  69.          {
  70.             int editedNumber = generateNewNumberBySwappingTwoDigits(numToEdit, i, j);
  71.  
  72.             if (editedNumber > leftNumber && editedNumber < rightNumber)
  73.                return true;
  74.          }
  75.       }
  76.    }
  77.    return false;
  78. }
  79.  
  80. // chosenDigitToSwapFromRight - idx from right to left that represents what digit we will replace with some other
  81.  
  82. // firstDigit = (num / 10^chosenIdx1) % 10; = 0 -> extracting the digit
  83. // secondDigit = (num / 10^chosenIdx2) % 10; = 6 -> extracting the second digit
  84.  
  85. int generateNewNumberBySwappingTwoDigits(int number, int chosenDigitToSwapFromRight, int chosenDigitToSwapWithFromRight)
  86. {
  87.    int firstDigit = (number / pow(10, chosenDigitToSwapFromRight)) % 10;
  88.    int secondDigit = (number / pow(10, chosenDigitToSwapWithFromRight)) % 10;
  89.    int builtNumber = 0;
  90.    int digIdx = 0;
  91.    int tens = 1;
  92.  
  93.    while (number != 0)
  94.    {
  95.       if (digIdx == chosenDigitToSwapFromRight)
  96.       {
  97.          builtNumber = builtNumber + secondDigit * tens;
  98.       }
  99.       else if (digIdx == chosenDigitToSwapWithFromRight)
  100.       {
  101.          builtNumber = builtNumber + firstDigit * tens;
  102.       }
  103.       else
  104.       {
  105.          builtNumber = builtNumber + (number % 10) * tens;
  106.       }
  107.  
  108.       tens *= 10;
  109.       number /= 10;
  110.       ++digIdx;
  111.    }
  112.    return builtNumber;
  113. }
  114.  
  115. int pow(int num, int toPower)
  116. {
  117.    if (toPower == 0)
  118.       return 1;
  119.    return pow(num, toPower - 1) * num;
  120. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement