一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第26天,点击查看活动详情。
回文数
题目解析
题目素材解析
根据题目中的描述来看,提供的素材是一个整数。
- 一个整数x;没有别的注意事项。
我的解读
首先题目给出了一个回文数的概念:正序和倒序数值一样,也就是说一个整数,反过来之后与原来的数字依然相同。
例如,1999的倒序是9991,很明显不是回文数。1991的倒序是1991,很明显这个就是回文数。
从这道题出发,难点就在于如何获取数字每一位的数字。
至于如何获取到数字的每一位数字,方式很多,比如转换成字符串进行截取,通过除以10来保留每一位的数字都可以。
解题思路
解题思路也是遵循着获取数字的每一位数字为前导。
第一步,获取数组的每一位数字,放置到List集合中。这里我用的是除以10的方式,每次除以10后取余值保存下来。
第二步,因为要判断倒序是否一样,所以需要首尾相对比,利用一前一后的元素进行对比,只要有一个不相等就证明不是回文数。
更具体的看一下代码吧。
代码
```java class Solution { public boolean isPalindrome(int x) { if(x == 0){ return true; } if(x < 0 || x % 10 == 0){ return false; } List numList = getIntList(x); int n = numList.size(); n = n % 2 == 0 ? n : n - 1; int l = 1, r = 1; boolean flag = true; while(l + r <= n){ int lz = numList.get(l-1); int nz = numList.get(numList.size() - r); if(lz != nz){ flag = false; break; }else{ l++; r++; } } return flag; }
private List<Integer> getIntList(int x){
List<Integer> list = new ArrayList<Integer>();
while (x != 0){
list.add(x % 10);
x = x / 10;
}
return list;
}
} ```
执行结果
聊着天刷什么题都不行,搞得思路都错了,一下子提交错了好多次。
换一种方法
想了想,其实在将每一个值获取出来的过程中,直接生成一个倒序数值即可。最后再与初始值进行比对。
通过循环来将每一个数值进行拼接,随后获得一个倒序数值,进行比较即可。
代码如下:
```java class Solution {
public boolean isPalindrome(int x) {
if(x == 0){
return true;
}
if(x < 0 || x % 10 == 0){
return false;
}
int result = 0;
int ten = getIntTen(x);
int n = x;
while (ten > 0){
result = result + n % 10 * ten;
n = n / 10;
ten = ten / 10;
}
return x == result;
}
private int getIntTen(int x){
int n = 1;
while (x >= 10){
n = n * 10;
x = x / 10;
}
return n;
}
} ```
速度稍快了一些,但是内存又稍多一些,看了看还有优化的空间。
Java代码本地执行
Java本地可调试代码,请参考github/Ijiran,可通过索引看到相应代码。
如下图所示: