🧠
Optimal (Reverse Half the Number)
💡 This approach optimizes by reversing only half the digits, avoiding overflow and unnecessary computation.
Intuition
Reverse the last half of the digits and compare with the first half to determine palindrome status.
Algorithm
- If number is negative or ends with zero (but not zero itself), return false.
- Initialize reversed half to 0.
- While original number is greater than reversed half, extract last digit and append to reversed half.
- After loop, compare original number with reversed half or reversed half divided by 10 (for odd length).
- Return true if equal, false otherwise.
💡 The key insight is that only half the digits need to be reversed to check palindrome.
def is_palindrome(x: int) -> bool:
if x < 0 or (x % 10 == 0 and x != 0):
return False
reversed_half = 0
while x > reversed_half:
reversed_half = reversed_half * 10 + x % 10
x //= 10
return x == reversed_half or x == reversed_half // 10
# Driver code
if __name__ == '__main__':
test_cases = [121, -121, 10, 0, 12321, 123321]
for num in test_cases:
print(f'is_palindrome({num}) = {is_palindrome(num)}')
Line Notes
if x < 0 or (x % 10 == 0 and x != 0):Exclude negative numbers and numbers ending with zero except zero itself.
reversed_half = 0Initialize reversed half number.
while x > reversed_half:Reverse digits until half or more is reversed.
reversed_half = reversed_half * 10 + x % 10Append last digit of x to reversed half.
x //= 10Remove last digit from x.
return x == reversed_half or x == reversed_half // 10Check palindrome for even and odd length numbers.
public class PalindromeNumber {
public static boolean isPalindrome(int x) {
if (x < 0 || (x % 10 == 0 && x != 0)) return false;
int reversedHalf = 0;
while (x > reversedHalf) {
reversedHalf = reversedHalf * 10 + x % 10;
x /= 10;
}
return x == reversedHalf || x == reversedHalf / 10;
}
public static void main(String[] args) {
int[] testCases = {121, -121, 10, 0, 12321, 123321};
for (int num : testCases) {
System.out.println("isPalindrome(" + num + ") = " + isPalindrome(num));
}
}
}
Line Notes
if (x < 0 || (x % 10 == 0 && x != 0)) return false;Exclude invalid palindrome candidates early.
int reversedHalf = 0;Store reversed half of the number.
while (x > reversedHalf)Reverse digits until half is processed.
reversedHalf = reversedHalf * 10 + x % 10;Append last digit to reversed half.
x /= 10;Remove last digit from x.
return x == reversedHalf || x == reversedHalf / 10;Check palindrome for even and odd length.
#include <iostream>
using namespace std;
bool isPalindrome(int x) {
if (x < 0 || (x % 10 == 0 && x != 0)) return false;
int reversedHalf = 0;
while (x > reversedHalf) {
reversedHalf = reversedHalf * 10 + x % 10;
x /= 10;
}
return x == reversedHalf || x == reversedHalf / 10;
}
int main() {
int testCases[] = {121, -121, 10, 0, 12321, 123321};
for (int num : testCases) {
cout << "isPalindrome(" << num << ") = " << (isPalindrome(num) ? "true" : "false") << endl;
}
return 0;
}
Line Notes
if (x < 0 || (x % 10 == 0 && x != 0)) return false;Exclude negative and trailing zero numbers early.
int reversedHalf = 0;Initialize reversed half number.
while (x > reversedHalf)Reverse digits until half is processed.
reversedHalf = reversedHalf * 10 + x % 10;Append last digit to reversed half.
x /= 10;Remove last digit from x.
return x == reversedHalf || x == reversedHalf / 10;Check palindrome for even and odd length numbers.
function isPalindrome(x) {
if (x < 0 || (x % 10 === 0 && x !== 0)) return false;
let reversedHalf = 0;
while (x > reversedHalf) {
reversedHalf = reversedHalf * 10 + x % 10;
x = Math.floor(x / 10);
}
return x === reversedHalf || x === Math.floor(reversedHalf / 10);
}
// Test cases
[121, -121, 10, 0, 12321, 123321].forEach(num => {
console.log(`isPalindrome(${num}) = ${isPalindrome(num)}`);
});
Line Notes
if (x < 0 || (x % 10 === 0 && x !== 0)) return false;Exclude negative and trailing zero numbers early.
let reversedHalf = 0;Initialize reversed half number.
while (x > reversedHalf)Reverse digits until half is processed.
reversedHalf = reversedHalf * 10 + x % 10;Append last digit to reversed half.
x = Math.floor(x / 10);Remove last digit from x.
return x === reversedHalf || x === Math.floor(reversedHalf / 10);Check palindrome for even and odd length numbers.
Only half the digits are processed, so time complexity is proportional to half the number of digits.
💡 For a 6-digit number, only about 3 iterations are needed, making it very efficient.
Interview Verdict: Accepted
This is the most optimal and recommended approach in interviews for this problem.