Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cmath>
- bool solution(int *arr, int size);
- bool checkIfPossibleToGenEditedNumberBiggerThanLeftSmallerThanRightBySwappingTwoDigits(int *arr, int size,
- int leftToEditedNumberIdx, int editedNumberIdx, int rightToEditedNumberIdx);
- int generateNewNumberBySwappingTwoDigits(int number, int chosenDigitToSwapFromRight, int chosenDigitToSwapWithFromRight);
- int pow(int num, int toPower);
- int main()
- {
- int arr[] = {13, 31, 30};
- int size = sizeof(arr) / sizeof(*arr);
- std::cout << solution(arr, size) << std::endl;
- }
- bool solution(int *arr, int size)
- {
- int counterOfBreaksToMakeArrayAscending = 0;
- for (int i = 1; i < size; ++i)
- {
- if (arr[i] <= arr[i - 1])
- ++counterOfBreaksToMakeArrayAscending;
- }
- // Three Cases:
- // Case A: it's already ascending array
- if (counterOfBreaksToMakeArrayAscending == 0)
- return true;
- // Case B: There has to be more than one swaps [between number digits] to make it happen, if it even could
- if (counterOfBreaksToMakeArrayAscending > 1)
- return false;
- // 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
- int leftToEditedNumberIdx = -1;
- int editedNumberIdx = -1;
- int rightToEditedNumberIdx = -1;
- for (int i = 0; i < size; ++i)
- {
- // left side of the condition will happen for sure only when the x y z are [...,x,y,]z
- if (i < size - 1 && arr[i] >= arr[i + 1])
- {
- leftToEditedNumberIdx = i - 1;
- editedNumberIdx = i;
- rightToEditedNumberIdx = i + 1;
- break;
- }
- }
- return checkIfPossibleToGenEditedNumberBiggerThanLeftSmallerThanRightBySwappingTwoDigits(arr, size,
- leftToEditedNumberIdx,
- editedNumberIdx,
- rightToEditedNumberIdx);
- }
- bool checkIfPossibleToGenEditedNumberBiggerThanLeftSmallerThanRightBySwappingTwoDigits(int *arr, int size,
- int leftToEditedNumberIdx, int editedNumberIdx, int rightToEditedNumberIdx)
- {
- int lengthOfNumber = log10(arr[editedNumberIdx]);
- int numToEdit = arr[editedNumberIdx];
- int leftNumber = leftToEditedNumberIdx != -1 ? arr[leftToEditedNumberIdx] : INT_MIN;
- int rightNumber = rightToEditedNumberIdx != size ? arr[rightToEditedNumberIdx] : INT_MAX;
- int editedNumber = -1;
- for (int i = 0; i <= lengthOfNumber; ++i)
- {
- for (int j = 0; j <= lengthOfNumber; ++j)
- {
- if (i != j)
- {
- int editedNumber = generateNewNumberBySwappingTwoDigits(numToEdit, i, j);
- if (editedNumber > leftNumber && editedNumber < rightNumber)
- return true;
- }
- }
- }
- return false;
- }
- // chosenDigitToSwapFromRight - idx from right to left that represents what digit we will replace with some other
- // firstDigit = (num / 10^chosenIdx1) % 10; = 0 -> extracting the digit
- // secondDigit = (num / 10^chosenIdx2) % 10; = 6 -> extracting the second digit
- int generateNewNumberBySwappingTwoDigits(int number, int chosenDigitToSwapFromRight, int chosenDigitToSwapWithFromRight)
- {
- int firstDigit = (number / pow(10, chosenDigitToSwapFromRight)) % 10;
- int secondDigit = (number / pow(10, chosenDigitToSwapWithFromRight)) % 10;
- int builtNumber = 0;
- int digIdx = 0;
- int tens = 1;
- while (number != 0)
- {
- if (digIdx == chosenDigitToSwapFromRight)
- {
- builtNumber = builtNumber + secondDigit * tens;
- }
- else if (digIdx == chosenDigitToSwapWithFromRight)
- {
- builtNumber = builtNumber + firstDigit * tens;
- }
- else
- {
- builtNumber = builtNumber + (number % 10) * tens;
- }
- tens *= 10;
- number /= 10;
- ++digIdx;
- }
- return builtNumber;
- }
- int pow(int num, int toPower)
- {
- if (toPower == 0)
- return 1;
- return pow(num, toPower - 1) * num;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement