专注于 JetBrains IDEA 全家桶,永久激活,教程
持续更新 PyCharm,IDEA,WebStorm,PhpStorm,DataGrip,RubyMine,CLion,AppCode 永久激活教程

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

题目

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

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);
};

文章永久链接:https://tech.souyunku.com/34663

未经允许不得转载:搜云库技术团队 » 算法小试--如何判断一个整数是复数

JetBrains 全家桶,激活、破解、教程

提供 JetBrains 全家桶激活码、注册码、破解补丁下载及详细激活教程,支持 IntelliJ IDEA、PyCharm、WebStorm 等工具的永久激活。无论是破解教程,还是最新激活码,均可免费获得,帮助开发者解决常见激活问题,确保轻松破解并快速使用 JetBrains 软件。获取免费的破解补丁和激活码,快速解决激活难题,全面覆盖 2024/2025 版本!

联系我们联系我们