算法小试--如何判断一个整数是复数

题目

判断一个整数是不是一个复数(从前日后读取得整数 == 从后往前读取得整数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);
};
复制代码
相关文章
相关标签/搜索