题目描述(力扣题库9) :
- 给你一个整数
x
,如果x
是一个回文整数,返回true
;否则,返回false
。回文数
是指正序(从左向右)和倒序(从右向左)读都是一样的整数。 - 例如,
121
是回文,而123
不是。
-
解题思路 :
- 这个题目和我之前发过的博客" 整数反转 -- 整数反转-java-CSDN博客" 十分类似 , 有兴趣的话,可以去看看,该题有两种解题方向,一种是利用字符串, 使用双指针法, 快速判断该数是否为回文数( 但这种方法会占用一些额外的空间 ), 二是整数的后半部分进行反转,然后与整数的前半部分进行比较。( 注意要分奇偶 )
-
法一: 双指针法
- 双指针法是一种常用的技巧,通常用于解决数组或字符串相关的问题。在这里,使用两个指针分别从字符串的开头和末尾向中间移动,逐个比较字符,以判断是否满足某种条件。在回文数判断中,左右指针分别指向字符串的开头和末尾,向中间移动并比较对应字符,以判断是否是回文数。
-
解题步骤:
- 1.如果输入的整数小于0,直接返回false,因为负数不可能是回文数。
- 2.将整数转换为字符串,方便进行逐个字符比较。
- 3.使用两个指针,一个指向字符串的开头,另一个指向字符串的末尾。
- 4.在每一步中,比较两个指针指向的字符,如果不相等,则返回false。
- 5.如果所有字符都比较完毕,没有发现不相等的情况,则返回true,表示是回文数。
- 以下是该方法的完整代码 ( 已在力扣通过 ) ( 用时 : 5 ms, 消耗内存分布: 42.84MB)
-
class Solution { public boolean isPalindrome(int x){ if (x < 0 || (x % 10 == 0 && x != 0)) return false; String str = String.valueOf(x); int left = 0; int right = str.length() - 1; while(left < right){ if(str.charAt(left) != str.charAt(right)) return false; left++; right--; } return true; } }
-
法二:
- 当判断一个整数是否为回文数时,我们可以不必将整数转换为字符串来进行比较。将整数的后半部分进行反转,然后与整数的前半部分进行比较。如果整数长度为偶数,当反转的数字大于等于原始数字时,就说明已经处理了一半的数字。如果整数长度为奇数,当反转的数字等于原始数字除以10时,就说明已经处理了一半的数字。
-
解题步骤:
- 1.初始化一个变量
reversed
为 0,用于存储反转后的数字。 - 2.在循环中,每次取原始数字
x
的个位数(通过x % 10
),将其加到reversed
的末尾。 - 3.每次处理完一个个位数后,将原始数字
x
除以10(通过x /= 10
)以去除已经处理过的个位数。 - 4.循环直到原始数字
x
小于reversed
,这时表示已经处理了一半的数字(对于奇数位数的数字,reversed
会多一位)。
- 1.初始化一个变量
- 以下是法二的完整代码 ( 用时 : 4ms, 消耗内存分布 : 42.86 MB)
-
class Solution { public boolean isPalindrome(int x) { // 负数和以0结尾的非零数不可能是回文数 if (x < 0 || (x % 10 == 0 && x != 0)) return false; int reversed = 0; while (x > reversed) { reversed = reversed * 10 + x % 10; x /= 10; } // 当数字长度为奇数时,reversed 会多一位,需要除以10去掉中间位 return x == reversed || x == reversed / 10; } }
-
- 以上就是本篇文章的全部内容,感谢观看