判断一个整数是不是一个复数(从前日后读取得整数 == 从后往前读取得整数
)javascript
Example 1:java
Input: 121
Output: true
复制代码
Example 2:bash
Input: -121
Output: false
`从前日后读是 -121,从后往前读是 121- 因此不是复数`
复制代码
Example 3:ui
Input: 10
Output: false
`从前日后读是 10,从后往前读是 01 因此不是复数`
复制代码
Example 4:spa
Input: 0
Output: true
`从前日后读是 0,从后往前读是 0 因此不是复数`
复制代码
要求: 不能经过把整数转化为字符串,来解决这个问题
code
首先分析下四个例子,咱们很容易得知限制的场景是怎样的。 首先负整数确定不符合,0符合, 可是能被10整除的显然也不符合。ip
因此,首先排除的是:
一、负整数
二、能被10整除的整数
三、非整数
复制代码
所谓的复数相等的逻辑,就是首先咱们要获取从后往前读的整数,进而和原来的整数进行比较,如若相等,必然是复数。
问题咱们如何获取从后往前读的整数呢,好比 `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 小于从后往前读取的数值的时候,说明已经到了一半的位置了;
复制代码
简单假设:字符串
整数个数为偶数string
x=1221 r=0
`==> x/10 ==> x % 10`
x=122 r=1
... ...
x=12 r= 1*10 + 2 == x
复制代码
偶数个数的整数此时正好相等it
整数个数为奇数
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);
};
复制代码