2022年第十三届蓝桥杯JAVA B组 试题 B: 山

试题 B: 山

本题总分:5 分
【问题描述】
这天小明正在学数数。
他突然发现有些正整数的形状像一座“山”,比如 123565321、145541,它
们左右对称(回文)且数位上的数字先单调不减,后单调不增。
小明数了很久也没有数完,他想让你告诉他在区间 [2022, 2022222022] 中有
多少个数的形状像一座“山”。
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

答案:3138
 

package lanqiao13;
/**
 * 杨亚磊
 * 试题 B: 山
 *
 * 本题总分:5 分
 * 【问题描述】
 * 这天小明正在学数数。
 * 他突然发现有些正整数的形状像一座“山”,比如 123565321、145541,它
 * 们左右对称(回文)且数位上的数字先单调不减,后单调不增。
 * 小明数了很久也没有数完,他想让你告诉他在区间 [2022, 2022222022] 中有
 * 多少个数的形状像一座“山”。
 * 【答案提交】
 * 这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
 * 个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
 *
 * 答案:3138
 */
public class B {
    public static void main(String[] args) {
        long l = 2022;
        int num = 0;
        for(;l <= 2022222022L;++l) {
            if(isShan(l)) {
                //验证代码!!!很重要!!!
                //输出几十个数,看一看效果,就能知道代码有没有写错!
                //System.out.println(l);
                num++;
            }
        }
        System.out.println(num);
    }
    //思路分析
    //1.编写一个单独的方法isShan判断一个数是不是‘山’
    //  1.1将这个数 ->字符串 ->字符数组
    //  1.2遍历数组判断是否 左右对称 和  前半部分是否单调不减
    //2.写一个循环依次将[2022, 2022222022]通过isshan判断并计数
    public static boolean isShan(long a) {
        String s = String.valueOf(a);
        char[] chars = s.toCharArray();
        //注意:for() 循环到数组中间元素得前一个元素
        //这里如果是 四位数如4554长度是4  数组元素从0开始 
        //故只需要访问chars[0] 和chars[1]就行
        //i < chars.length/2需要体会,可以用笔 举例子
        for (int i = 0; i < chars.length/2; i++) {
            //注意:if()需要实现 是否 前半部分是否单调不减(可以等) 和 左右对称
            if(chars[i] > chars[i+1] 
                        || chars[i] != chars[chars.length-1-i]) {
                return false;
            }
        }
        return true;
    }
}

这里我想说:结果填空题不能错,一定要细心,一定要检查。要把能拿的分拿到!

这题很容易出现错误得!  例如这样:

错误:

正确: