判斷一個整數是不是一個複數(從前日後讀取得整數 == 從後往前讀取得整數
)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);
};
複製代碼