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

2020-04-13 11:36:39 蜻蜓队长

题目

判断一个整数是否是一个复数(从前往后读取得整数 == 从后往前读取得整数

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);
};
复制代码

以上内容来自于网络,如有侵权联系即删除
相关文章

上一篇: 面试官:请实现三栏布局,尽可能多的方式。

下一篇: 百亿级实时查询优化实战,让你的Elasticsearch飞起来!

客服紫薇:15852074331
在线咨询
客户经理