题目
判断一个整数是否是一个复数(从前往后读取得整数 == 从后往前读取得整数
)
Example 1:
Input: 121
Output: true
复制代码
Example 2:
Input: -121
Output: false
`从前往后读是 -121,从后往前读是 121- 所以不是复数`
复制代码
Example 3:
Input: 10
Output: false
`从前往后读是 10,从后往前读是 01 所以不是复数`
复制代码
Example 4:
Input: 0
Output: true
`从前往后读是 0,从后往前读是 0 所以不是复数`
复制代码
要求: 不能通过把整数转化为字符串,来解决这个问题
分析
首先分析下四个例子,我们很容易得知限制的场景是怎样的。 首先负整数肯定不符合,0符合, 但是能被10整除的显然也不符合。
所以,首先排除的是:
1、负整数
2、能被10整除的整数
3、非整数
复制代码
所谓的复数相等的逻辑,就是首先我们要获取从后往前读的整数,进而和原来的整数进行比较,如若相等,必然是复数。
问题我们如何获取从后往前读的整数呢,比如 `12321` , 我们得到从后往前读的 `12321` 才可以。
肯定第一种方法想到就是把整数转化为字符串,可惜不允许使用这个方法。
突然发现,凡是是复数的数字其实有一定的规律,比如 `1221` , 从前往后的前两个数字是 `12`, 从后往前的前两个数字是12,假设整数的长度是偶数的时候,只要 `12 == 12`,就可以证明这是个复数;
如果整数长度是奇数呢,比如 `12321`,只能证明 `12` 和 `12` 相等即可。
所以我们只需要获取数字的一半长度的值就可以了。
现在该如何读取倒序的数字呢?
假设 x = 1221 , x % 10 = 1 获取倒数第一个数字是 1,
然后 x / 10 得到整数 122;
然后当 x = 122 时,x % 10 = 2; 获取到倒数第二个数字是 2
r = 1 * 10 + 2 = 12 得到的就是我们想要的数据;
还有一个问题,我们需要判断我们刚好取到了长度一半的数据呢?
在上面的例子里,刚好 12 == 12, 如果再多进行一步,则 x = 1,此时 x 肯定小于得到的值,所以等 x 小于从后往前读取的数值的时候,说明已经到了一半的位置了;
复制代码
简单假设:
整数个数为偶数
x=1221 r=0
`==> x/10 ==> x % 10`
x=122 r=1
... ...
x=12 r= 1*10 + 2 == x
复制代码
偶数个数的整数此时正好相等
整数个数为奇数
x=12321 r=0
`==> x/10 ==> x % 10`
x=1232 r=1
... ...
x=123 r= 1*10 + 2 = 12
... ...
x = 12 r= 12 * 10 + 3 = 123 / 10 = 12
复制代码
x == 取整(r / 10) 的时候才能相等
解决方案
java
class Solution {
public boolean isPalindrome(int x) {
if (x < 0 || (x != 0 && x % 10 == 0))
return false;
int reverseNumber = 0;
while (x > reverseNumber) {
reverseNumber = reverseNumber * 10 + x % 10;
x /= 10;
}
// 假设整数的个数是偶数,使用 x == reverseNumber 判断
// 比如 1221 最终 x = 12 reverseNumber = 12
// 假设整数的个数是奇数,使用 reverseNumber % 10 == x 判断
// 比如 12321 最终 x = 12 reverseNumber = 123 而 reverseNumber / 10 = 12
return x == reverseNumber || x == reverseNumber / 10;
}
}
复制代码
javascript
/**
* @param {number} x
* @return {boolean}
*/
var isPalindrome = function (x) {
if (Number.isNaN(x)) return false;
// 小数 和 类似 10 20不符合要求 0符合
if (x < 0 || (x != 0 && x % 10 == 0)) return false;
let reverseNumber = 0;
// 获取一半的倒数数字
while (x > reverseNumber) {
reverseNumber = reverseNumber * 10 + x % 10;
x = parseInt(x / 10);
}
// 假设整数的个数是偶数,使用 x == reverseNumber 判断
// 比如 1221 最终 x = 12 reverseNumber = 12
// 假设整数的个数是奇数,使用 reverseNumber % 10 == x 判断
// 比如 12321 最终 x = 12 reverseNumber = 123 而 reverseNumber / 10 = 12
return x == reverseNumber || x == parseInt(reverseNumber / 10);
};
复制代码