回文数
给你一个整数 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
中点逆序
只反转一半的数字,这样可以避免反转后的数字溢出,还能减少计算。
class Solution {
public boolean isPalindrome(int x) {
if (x < 0 || (x % 10 == 0 && x != 0)) {
return false;
}
int revert = 0;
while (revert < x) {
revert = 10 * revert + x % 10;
x /= 10;
}
return revert == x || revert / 10 == x;
}
}
验证回文串1
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
示例 1:
输入: “A man, a plan, a canal: Panama”
输出: true
示例 2:
输入: “race a car”
输出: false
转化为新的字符串
class Solution {
public boolean isPalindrome(String s) {
int len = s.length();
StringBuilder newStr = new StringBuilder();
for (int i = 0; i < len; i++) {
if (Character.isLetterOrDigit(s.charAt(i)))
newStr.append(Character.toLowerCase(s.charAt(i)));
}
for (int i = 0, j = newStr.length() - 1; i < j; i++, j--) {
if (newStr.charAt(i) != newStr.charAt(j))
return false;
}
return true;
}
}
在原字符串上直接判断
class Solution {
public boolean isPalindrome(String s) {
for (int i = 0, j = s.length() - 1; i < j; i++, j--) {
char c1, c2;
while (i < j && !Character.isLetterOrDigit(s.charAt(i)))
i++;
while (i < j && !Character.isLetterOrDigit(s.charAt(j)))
j--;
if (i < j) {
if (Character.toLowerCase(s.charAt(i)) != Character.toLowerCase(s.charAt(j)))
return false;
}
}
return true;
}
}
验证回文串2
给定一个非空字符串 s,最多删除一个字符。判断是否能成为回文字符串。
示例 1:
输入: “aba”
输出: True
示例 2:
输入: “abca”
输出: True
解释: 你可以删除c字符。
递归
class Solution {
private boolean flag = false;
public boolean validPalindrome(String s) {
int len = s.length();
int left = 0, right = len - 1;
while (left < right) {
if (s.charAt(left) == s.charAt(right)) {
left++;
right--;
} else {
if (flag)
return false;
flag = true;
return validPalindrome(s.substring(left + 1, right + 1)) ||
validPalindrome(s.substring(left, right));
}
}
return true;
}
}