7. Reverse Integer
Given a signed 32-bit integer x, return x with its digits reversed. If reversing x causes the value to go outside the signed 32-bit integer range [ − 2 31 , 2 31 − 1 ] [-2^{31}, 2^{31} - 1] [−231,231−1], then return 0.
Assume the environment does not allow you to store 64-bit integers (signed or unsigned).
Example 1:
Input: x = 123
Output: 321
Example 2:
Input: x = -123
Output: -321
Example 3:
Input: x = 120
Output: 21
Constraints:
- − 2 31 < = x < = 2 31 − 1 -2^{31} <= x <= 2^{31} - 1 −231<=x<=231−1
From: LeetCode
Link: 7. Reverse Integer
Solution:
Ideas:
1. Initialize a result variable (reversed) to zero: This will hold our reversed number.
2. Loop until x is zero:
- Extract the last digit of x using x % 10.
- Divide x by 10 to remove the last digit.
3. Overflow/Underflow check:
- Before appending a digit to reversed, check if appending it would cause the number to overflow or underflow the 32-bit integer limits (INT_MAX and INT_MIN from limits.h).
- If overflow or underflow is detected, return 0.
4. Construct the reversed number:
Multiply the current reversed by 10 (shift digits left) and add the extracted digit.
Code:
c
int reverse(int x) {
int reversed = 0;
while (x != 0) {
int digit = x % 10; // Get the last digit of x
x /= 10; // Remove the last digit from x
// Check for potential overflow/underflow before actually adding the digit
if (reversed > INT_MAX / 10 || (reversed == INT_MAX / 10 && digit > 7)) {
return 0; // Overflow condition for positive numbers
}
if (reversed < INT_MIN / 10 || (reversed == INT_MIN / 10 && digit < -8)) {
return 0; // Underflow condition for negative numbers
}
reversed = reversed * 10 + digit; // Append the digit
}
return reversed;
}