问题描述
求2022-2022222022间的特殊回文数,特殊回文数要求如下:回文数的形状像一座“山”,比如 123565321 、 145541 ,它们左右对称(回文)且数位上的数字先单调不减,后单调不增。
特殊回文数样例:
121、1221、2331、23331
思路分析
可使用暴力求解,依次累加,创建判断特殊回文数的布尔方法。
将每个数字转换为字符串,求字符串长度和中间值。
偶数和奇数分别讨论,判断是否满足题中条件。
代码
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
int count = 0;//计数器
for (long i = 2022; i <= 2022222022; i++) {//长整型i依次累加
if (check(i)) {//如果布尔函数返回值为真
count++;
}
}
System.out.println(count);
}
private static boolean check(long n) {//在类中定义静态布尔方法,无需创建对象直接调用
int flag1 = 1, flag2 = 1, flag3 = 1;//定义flag进行判定
String str = String.valueOf(n);//valueof(n)方法将数字n转换为字符串
int len = str.length();// 求字符串长度
int mid = len / 2;//求中间值
if (len % 2 == 1) {//奇数的情况如12321
int i, j;
for (i = 0; i < mid; i++) {//确保中间值左边递增
if (str.charAt(i) > str.charAt(i + 1)) {//charAt(i)函数返回字符串索引对应的值
flag1 = 0;
break;
}
}
for (j = mid; j < len - 1; j++) {//确保中间值右边递减
if (str.charAt(j) < str.charAt(j + 1)) {
flag2 = 0;
break;
}
}
for (i = 0, j = len - 1; i < mid && j > mid; i++, j--) {//确保满足回文数
if (str.charAt(i) != str.charAt(j)) {
flag3 = 0;
break;
}
}
if (flag1 == 1 && flag2 == 1 && flag3 == 1)//前面三个条件均满足,则为奇数特殊回文数
return true;
}
if (len % 2 == 0) {//偶数的情况
int i, j;
for (i = 0; i < mid - 1; i++) {//确保中间值左边递增
if (str.charAt(i) > str.charAt(i + 1)) {
flag1 = 0;
break;
}
}
for (j = mid; j < len - 1; j++) {//确保中间值右边递减
if (str.charAt(j) < str.charAt(j + 1)) {
flag2 = 0;
break;
}
}
for (i = 0, j = len - 1; i <= mid - 1 && j >= mid; i++, j--) {//确保满足回文数
if (str.charAt(i) != str.charAt(j)) {
flag3 = 0;
break;
}
}
if (flag1 == 1 && flag2 == 1 && flag3 == 1)//前面三个条件均满足,则为偶数特殊回文数
return true;
}
return false;//如果奇数特殊回文数和偶数特殊回文数均不满足,则返回false
}
}
结果
3138