题目: Palindrome Number
 描述:Determine whether an integer is a palindrome.An integer is apalindrome when it reads the same backward as forward.
 示例:
 Example 1:
 Input: 121
 Output: true
Example 2:
 Input: -121
 Output: false
 Explanation: From left to right, it reads -121. From right to left, it becomes 121-. Therefore it is not a palindrome.
Example 3:
 Input: 10
 Output: false
 Explanation: Reads 01 from right to left. Therefore it is not a palindrome.
 Follow up:
 提示:
 Coud you solve it without converting the integer to a string?
 来源:力扣(LeetCode)
 分析:题目大意就是叫你写个程序,判断整数回文数。回文数,学过编程应该都多少了解,就是一串数字,正着读和倒着读都一样。这没什么好说的了。
 解法一:将数字反转,判断前后是否相等
 定义long变量,最后结果转型为int。也是比较直接的解法,当然,这个算法并不是很好,因为容易碰到整型溢出的问题,所以并不推荐,仅供参考学习。
 Java代码:
   /** * 解法一:将数字反转,判断前后是否相等 * @param x * @return */
    public static int reverse(int x){
   
        long n=0;
        while (x!=0){
   
            n = n*10+x%10;
            x = x/10;
        }
        return (int)n;
    }
  解法二:先转为字符串,再进行判断。
    /** * 解法三:转为字符串处理 * @param x * @return */
        public boolean isPalindrome2(int x) {
   
            String reversedStr = (new StringBuilder(x + "")).reverse().toString();
            return (x + "").equals(reversedStr);
        }
  解法三:对前一半与后一半的数字进行比较,相等即可证明为回文数。
 算法详解:认真观察,回文数是有一定规律特征可循的,比如,与其知道什么是回文数,何不如反过来问,什么样的数不是回文数?
 1.负数不可能为回文数。
 因为一个数符号总是在高位前面,最低位之后不可能再有正负号,因此前后并不满足相等的情况。
 2.数字末位为0的不可能是回文数:
 因为如果满足条件,那么高位也必须为0,显然这个条件不成立,当然,就一位数的情况另当别论,这种情况一定是回文没错了。二者并不冲突,仔细思考便知!
 那么如何取到数字前半段与后半段进行比较判断,方法其实和之前的题目:leetcode7.ReverseInteger(整数反转)类似,可以通过取余和作除的方法获取到各位数字后进行后续判断。
那么问题来了,我们如何知道反转数字的位数已经达到原始数字位数的一半?
 由于整个过程我们不断将原始数字除以 10,然后给反转后的数字乘上 10,所以,当原始数字小于或等于反转后的数字时,就意味着我们已经处理了一半位数的数字了。(那些说不理解的,请认真思考一下,就是一个简单的数学逻辑,并不困难!)
  /** * 解法二:前后对半比较 * @param x * @return */
    public static boolean isPalindrome1(int x){
   
        if (x<0 ||( x % 10 == 0 && x!=0)){
   
            return false;
        }
        int reverNumber = 0;
        while (x>reverNumber){
   
            reverNumber = reverNumber*10+x%10;
            x/=10;
        }
        //分为奇数,偶数情况比较,如果是前者,直接去掉处于中间的中位数再比较。
        return x==reverNumber||x==reverNumber/10;
    }
  当然,这也是leetcode的官方解法之一,如果还想看更详细的分析,请移步leetcode官网。我是官网传送门
 补:解法三复杂度:
 时间复杂度:O(log10^(n))
 空间复杂度:O(1)

京公网安备 11010502036488号