给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。
回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是。
示例 1: 输入:x = 121 输出:true 示例 2: 输入:x = -121 输出:false 解释:从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。 示例 3: 输入:x = 10 输出:false 解释:从右向左读, 为 01 。因此它不是一个回文数。 示例 4: 输入:x = -101 输出:false
1. 转为字符串判断
将给定的数字转为字符串,判断正向的字符串和逆向的字符串是否相等
classSolution { publicbooleanisPalindrome(intx) { Stringtempx=String.valueOf(x); Stringreversex=newStringBuffer(tempx).reverse().toString(); if(tempx.equals(reversex)){ returntrue; } returnfalse; } }
优点: 容易理解
缺点: 占用内存大
2. 不使用字符串,直接对数字首尾判断
不使用字符串,直接对数字进行首尾判断
获取第一位数字使用除法可以得到
获取最后一位数字可以使用取模得到
classSolution { publicbooleanisPalindrome(intx) { // 排除边界if(x==0){ returntrue; } if(x%10==0||x<0){ returnfalse; } // 获取数字的长度intlength=1; while(x/length>=10){ length*=10; } // 循环判断首尾数字while(x>0){ if(x/length!=x%10){ returnfalse; } // 每次将头尾两个数字去掉,获取剩下的数字x=(x%length)/10; // 长度每次都要除以100 length/=100; } returntrue; } }
执行时间有所优化,内存占用没有太大提升
3. 将数字分为两半
看了题解...
将给定的数字分为两半,前一半和后一半比较
比如 1221 前一半为12 后一半为21(反转后为12),这样去比较
classSolution { publicbooleanisPalindrome(intx) { // 排除边界if(x==0){ returntrue; } if(x%10==0||x<0){ returnfalse; } // 将数字分为两半 获取后一半数字inthalfnum=0; while(halfnum<x){ halfnum=halfnum*10+x%10; x/=10; } // 分成两半的时候需要区分偶数和基数,偶数可以直接== 奇数就需要排除后一半的一位 /10returnhalfnum==x||halfnum/10==x; } }
效率100%,但是内存占用还是比较高