官方链接:https://leetcode-cn.com/problemset/all/
一、题意
难度:简单
https://leetcode-cn.com/problems/palindrome-number/
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
示例
输入: 121
输出: true
输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。
进阶:
你能不将整数转为字符串来解决这个问题吗?
二、解题
方法一:双指针
思路:
在不看进阶条件的情况下,大多数人想到的肯定是转换成字符串再两两进行对比判断是否一致
代码:
class Solution {
public boolean isPalindrome(int x) {
// 将数值转换成字符串
String str = "" + x;
// 指针
int left = 0, right = str.length() - 1;
// 遍历字符串
while(left < right){
// 如果两位字符不一致则返回 false
if(str.charAt(left++) != str.charAt(right--)){
return false;
}
}
// 是回文数值,返回 true
return true;
}
}
复杂度分析:
- 时间复杂度:O(N)
- 空间复杂度:O(log(N))
方法二:数学
思路:
进阶的条件是不将整数转为字符串,那么我们能不能将该数值直接翻转过来呢?这里我们需要考虑到 int 类型溢出的问题,整体反转显然不合适。而且题目要求是验证是否为回文数,既然是回文数,肯定是从中间向两边延伸都是两两相同的,那么我们就可以只翻转一半即可。
代码:
class Solution {
public boolean isPalindrome(int x) {
// 特殊判断
if(x < 0 || (x > 0 && x % 10 == 0)){
return false;
}
// 翻转变量
int reverse = 0;
// 当 reverse 大于或者等于 x 的时候即达到该数值的一半位数
while(reverse < x){
// 数值拼接
reverse = reverse * 10 + x % 10;
// 舍弃个位数
x /= 10;
}
// X 长度有奇数和偶数两种情况,如果是偶数则两数相等,如果是奇数则 reverse 得去除个位数再进行比较
return reverse == x || reverse / 10 == x;
}
}
复杂度分析:
- 时间复杂度:O(log(N))
- 空间复杂度:O(1)
今天的文章到这里就结束了,小伙伴们有什么建议或者意见请联系我改进哦,你们的支持是我最大的动力!!!