算法小試--如何判斷一個整數是複數

題目

判斷一個整數是不是一個複數(從前日後讀取得整數 == 從後往前讀取得整數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);
};
複製代碼
相關文章
相關標籤/搜索