蓝桥杯Java——特殊回文数(最简单的判断方法)

问题描述

求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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值