当前位置: 首页 > news >正文

蓝桥杯2024JavaB组的一道真题的解析

文章目录

  • 1.问题描述
  • 2.问题描述
  • 3.思路分析
  • 4.代码分析

1.问题描述

这个是我很久之前写的一个题目,当时研究了这个题目好久,发布了一篇题解,后来很多人点赞,我都没有意识到这个问题的严重性,我甚至都在怀疑自己:我写的题解这么优秀吗?

临近蓝桥杯,最近也是在研究这个蓝桥杯的真题嘛,这个题目实际上就是真题,但是当时我并不知道,现在回头去看这个去年的11月份我写下来的对应的题解,也让我想了好久,才发现了这个规律,所以今天记录下来

image-20250403205232762

下面的这个是大家的评论,这个方法绝对是很巧妙的,但是不容易想到,我也忘记了自己当时是怎么想到的:

image-20250403205918800

2.问题描述

上面的这个图片里面已经把这个题目的问题描述的很清楚了,我觉得,实际上,下面的这个数列的结果基本上就是后面的一项等于前面的三项的和;

前面的几个数据其实就是我们的这个数的每一个数位上面的数字,例如这个197,他的每一个数位上面的数据组成了我们的下面的数列里面的前面的三个数据;

17就是前面的三个数字的求和,33就是他前面的三个数字的求和以此类推下去,发现找到了这个197,因此这个197就是一个类斐波那契数;

他需要我们求接的就是这个0-10000000里面的这个最大的斐波那契数;

image-20250403210024095

3.思路分析

因为这个在去年的蓝桥杯的省赛里面是一个填空题,相较于这个编程题,其实这类题目是容易拿分的,我觉得,但是这个题目因为给定的这个数据范围比较大吗,所以这个其实如果我当时在考场上面,可能做不出来这个题目;

下面说一下我的这个思路,每一项是前面的几个项求和,这个规律很好找,但是如果要是真正的无脑进行计算,这个其实计算量是蛮大的,因此不妨看一下我下面的这个思路:

使用这个197作为例子把,实际上我们规定一个数组:

初始情况下这个数组里面的元素就是:[1,9,7];

这个时候我们计算一下前面的几个数据的求和,加入到数组里面去:[1,9,7,17];

接下来就是去掉数组里面的第一个数据,最后一个数据*2减去第一个新的数据:

1)首先去掉数组里面的第一个数据就是1,9,7,17

2)乘上二减去第一个元素就是17*2-1=33,这个元素就是我们的新的元素;

3)去掉第一个元素,更新之后的这个数组就是[9,7,17,33];

4)乘上2减去第一个新的元素:33乘上2=66,减去第一个新元素9=57,和上面的例子是一样的;

5)这个时候的数组就是9,7,17,33,57,去掉第一个元素就是7,17,33,57;

6)57*2-7==107符合上面的这个情况;

7)综上所述,大家是可以发现,这个实际上就是乘上2减去数组里面的第一个元素,这个数值添加到我们的数组里面去,然后就是去掉数组里面的第一个元素,以此类推,一直进行下去;

8)这个方法不能说非常的高明,但是比这一项等于前面的三项的数据求和的这个方法更好一些把,我觉得更容易实现一些;

4.代码分析

1)下面的这个就是我当时发布题解的时候的代码,里面是有一部分注释的,但是可能杰士德不是很清楚,因此我再次说明一下

2)首先需要关注的就是这个里面的main方法,确定这个筛选的范围,pd就是我们的自定义的方法,返回值是布尔值,如果是真的,这个时候就会被打印输出,假的的话an=0保持初始数值;

3)pd方法里面,首先是对于这个传进来的参数进行拆解,分成不同的数位上面的数据;

4)anss就是把拆解之后的每一个数位上面的数据求和,添加到我们的这个数组里面去;

5)*2-ans.get(0)就是上面的这个思路分析里面的乘上2减去这个数组里面的第一个元素,粑粑这个数据添加到我们的数组里面去

6)remove方法把我们的数组里面的第一个数据溢移除,和上面的这个思路里面的做法是一致的;

7)其实这个先添加还是先删除的这个顺序是没有影响的;

8)因为这个是一个循环吗,所以如果可以找到,就会跳出来,超过了这个i这个数值还是没有找到,说明这个数据就是不符合条件的,我们也会从这个循环里面跳出来;

import java.util.ArrayList;
import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        long an=0;
        for(int i=197;i<1e7;i++){
            if(pd(i)){
                an=i;
            }
        }
        System.out.println(an);
    }

    private static boolean pd(int i){
        ArrayList<Integer> ans = new ArrayList<>();
        String s=""+i;
        int anss=0;
        //转换为这个string方便获取每一个数位上面的证书
        for(int j=0;j<s.length();j++){
            //下面的这个ans就是我们的列表容器
            ans.add(s.charAt(j)-'0');
            anss=anss+s.charAt(j)-'0';
        }
        //上面的这个循环究竟是在干什么事情:下面的这个以1234为例子说明,方便理解
        //列表 ans 存储了整数 1234 的各个数位数字 [1, 2, 3, 4],
        // 变量 anss 的值为 10,即整数 1234 各个数位数字的总和。

        ans.add(anss);
        //这个时候i的数组元素就是ans[1,2,3,4,10]
        while(true){
            //乘以2减去这个里面的第一个元素就是这个类斐波那契数列的规律,避免使用纯粹的数学方法计算
            anss=(anss*2)-ans.get(0);
            ans.remove(0);
            ans.add(anss);
            if(anss==i){
                return true;
            }else if(anss>i){
                return false;
            }
        }
    }
}
http://www.dtcms.com/a/108665.html

相关文章:

  • 云计算:基础、概念与未来展望
  • vue2拖拉拽做个模拟公式工具
  • 计算机视觉算法实战——基于YOLOv8的行人流量统计系统
  • 缺页异常导致的iowait打印出相关文件的绝对路径
  • Linux红帽:RHCSA认证知识讲解(十)使用 tar创建归档和压缩文件
  • RAG库搭建:从零开始,开启智能问答新世界
  • OpenCV 图形API(15)计算两个矩阵(通常代表二维向量的X和Y分量)每个对应元素之间的相位角(即角度)函数phase()
  • Ubuntu换Windows磁盘格式化指南
  • 二,<FastApi>FastApi的两个核心组件
  • JavaScript基础-window.sessionStorage
  • 通信算法之255:无人机频谱探测设备技术详解
  • 使用Kafka和kafkajs构建示例项目
  • 前端面试题(三):axios有哪些常用的方法
  • Linux上位机开发实践(从用板子到自己做板子)
  • 针对 SQL 查询中 IN 子句性能优化 以及 等值 JOIN 和不等值 JOIN 对比 的详细解决方案、代码示例及表格总结
  • Webpack vs Vite:现代前端构建工具的巅峰对决与选型指南
  • Linux学习七——进程回收
  • 一文详解QT环境搭建:Windows平台Qt安装配置指南
  • react 15-16-17-18各版本的核心区别、底层原理及演进逻辑的深度解析--react18
  • 电脑异常关机导致oracle监听器启动后自动停止
  • 蓝桥杯 web 请到下一步
  • Spread使用 配合report使用前篇
  • python爬虫基础讲解
  • 【调用通义千问实现手写文字识别】
  • 04-08手写持久层框架——核心配置和映射配置文件解析
  • 从零构建大语言模型全栈开发指南:第四部分:工程实践与部署-4.2.1视觉-语言模型(VLM)架构设计(CLIP与Flamingo模式)
  • HarmonyOS 基础组件和基础布局的介绍
  • Nyquist插件基础:LISP语法-条件语句
  • 数据量管理系统
  • 光学关键尺寸量测设备市场报告:2024年全球市场销售额达到了14.75亿美元