class Solution {
public boolean isPalindrome(int x) {
if(x<0){ //x为负肯定不是回文数
return false;
}
if(x<10){ // x为个位数一定是回文数
return true;
}
String x_str = Integer.toString(x); //将x装换位字符串
int length = x_str.length();
for(int i=0;i<length/2;i++){
if(x_str.charAt(i) != x_str.charAt(length-i-1)){ //比较第i位与倒数第i为是否相同
return false;
}
}
return true;
}
}
理清思路:
通过以上分析我们把遍历范围缩小到了**1~105 **,我们只需要遍历1~105 内的所有数字,并按上述两种方式拼接得到一个新的数字,判断新的数字是否回文数即可。
结合下面代码会更清晰:
class Solution {
public int superpalindromesInRange(String left, String right) {
long left_long = Long.valueOf(left);
long right_long = Long.valueOf(right);
int count=0;
int MAX = 100000;
//统计奇数拼接得到的回文数
for(int i=1;i<MAX;i++){
StringBuilder sb = new StringBuilder(Integer.toString(i));
for(int j=sb.length()-2;j>=0;--j){ //奇数拼接,从倒数第二位向前遍历拼接
sb.append(sb.charAt(j));
}
long sb_long = Long.valueOf(sb.toString());
sb_long *=sb_long;
if(sb_long>right_long){ //超过给定的范围
break;
}
if(sb_long>=left_long && isPalindrome(sb_long)){ //在范围内,并且平方为回文数
++count;
}
}
//统计偶数拼接得到的回文数
for(int i=1;i<MAX;i++){
StringBuilder sb = new StringBuilder(Integer.toString(i));
for(int j=sb.length()-1;j>=0;--j){ //偶数拼接,从最后一位向前遍历拼接
sb.append(sb.charAt(j));
}
long sb_long = Long.valueOf(sb.toString());
sb_long*=sb_long;
if(sb_long>right_long){ //超过给定的范围
break;
}
if(sb_long>=left_long && isPalindrome(sb_long)){ //在范围内,并且平方为回文数
++count;
}
}
return count;
}
//判断x是否为回文数
public boolean isPalindrome(long x) {
if(x<0){ //x为负肯定不是回文数
return false;
}
if(x<10){ // x为个位数一定是回文数
return true;
}
String x_str = Long.toString(x); //将x装换位字符串
int length = x_str.length();
for(int i=0;i<=length/2;i++){
if(x_str.charAt(i) != x_str.charAt(length-i-1)){ //比较第i位与倒数第i为是否相同
return false;
}
}
return true;
}
}
创作挑战赛
新人创作奖励来咯,坚持创作打卡瓜分现金大奖
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/weixin_43598687/article/details/124218044
内容来源于网络,如有侵权,请联系作者删除!