给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。
回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
例如,
121是回文,而123不是。
bool isPalindrome(int x) {
// 负数和以 0 结尾的正数不是回文数
if (x < 0 || (x % 10 == 0 && x != 0)) {
return 0; // false
}
int reversed = 0; // 用于存放反转后的整数
while (x > reversed) {
reversed = reversed * 10 + x % 10; // 反转最后一位
x /= 10; // 去掉最后一位
}
// 如果长度是偶数,两个部分应该相等
// 如果长度是奇数,去掉中间位再比较
return x == reversed || x == reversed / 10;
}判断负数和特定正数的条件:
x < 0:如果x是负数,直接返回false(0)。负数不可能是回文数,因为负号只在左边。x % 10 == 0 && x != 0:如果x的最后一位是 0(即x可以被 10 整除),并且x不是 0,本身也不是回文数。因为回文数的最后一位不能是 0(除了 0 本身)
反转整数:
int reversed = 0:初始化一个变量reversed,用于存放反转后的整数。while (x > reversed):循环条件是x大于reversed,即只需反转到x的一半。这个条件确保只需处理一半的数字,以避免整数字的溢出。reversed = reversed * 10 + x % 10:这行代码的作用是取x的最后一位(x % 10),并将其添加到reversed的末尾。通过将reversed乘以 10 来移动其数字位置,为新加的数字留出空间。x /= 10:去掉x的最后一位,准备进行下一轮循环。
判断回文:
return x == reversed:如果x是偶数位数的回文,反转后的值reversed应与x相等。x == reversed / 10:如果x是奇数位数的回文,反转后中间的那一位可以忽略。通过reversed / 10来去掉中间的那一位(在反转过程中总是会多出一位),然后比较剩下的部分。