题目: 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)