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

《从入门到精通:蓝桥杯编程大赛知识点全攻略》(十一)-回文日期、移动距离、日期问题

前言

在这篇博客中,我们将通过模拟的方法来解决三道经典的算法题:回文日期、移动距离和日期问题。这些题目不仅考察了我们的基础编程能力,还挑战了我们对日期处理和数学推理的理解。通过模拟算法,我们能够深入探索每个问题的核心逻辑,并尝试用更直观的方式解决问题。接下来,我们将逐步讲解每道题的思路与实现代码,帮助大家更好地理解这些常见的算法题。


回文日期

在日常生活中,通过年、月、日这三个要素可以表示出一个唯一确定的日期。
牛牛习惯用 8位数字表示一个日期,其中,前 4位代表年份,接下来 2位代表月份,最后 2位代表日期。
显然:一个日期只有一种表示方法,而两个不同的日期的表示方法不会相同。
牛牛认为,一个日期是回文的,当且仅当表示这个日期的 8位数字是回文的。
现在,牛牛想知道:在他指定的两个日期之间(包含这两个日期本身),有多少个真实存在的日期是回文的。
一个 8 位数字是回文的,当且仅当对于所有的 i(1≤i≤8) 从左向右数的第 i个数字和第 9−i个数字(即从右向左数的第 i个数字)是相同的。
例如:
对于 2016年 11 月 19日,用 8位数字 20161119表示,它不是回文的。对于 2010年 1月 2 日,用 8位数字 20100102表示,它是回文的。
对于 2010年 10 月 2 日,用 8位数字 20101002表示,它不是回文的。
输入格式
输入包括两行,每行包括一个 8位数字。
第一行表示牛牛指定的起始日期 date1,第二行表示牛牛指定的终止日期 date2
。保证 date1 和 date2都是真实存在的日期,且年份部分一定为 4位数字,且首位数字不为 0。
保证 date1 一定不晚于 date2。
输出格式
输出共一行,包含一个整数,表示在 date1和 date2之间,有多少个日期是回文的。
输入样例:

20110101
20111231

输出样例:

1

算法思路

在这里插入图片描述
回文日期后4位是前4位的相反,故我们只需要枚举前4位就可以得到后4位的结果。因为我们可以直接枚举从1000~9999即可。循环将i记录分别为date和x,然后循环4次,每一次将date = date * 10 + x % 10,接着x = x / 10,就可以实现回文数字。
日期必须在题中给出的范围之内,比较范围可以直接用数组比较大小即可。
最重要的是判断日期是否合法。故写一个日期判断函数即可。
提前将每个月的天数用days数组存储,分别将年份、月份、天分别提取出来,当月份等于0或者月份大于12肯定不符合;当天数等于0或者当除了2月之外每个月对应的天数大于days数组对应的天数也不符合;接下来分别判断2月份时是否是平年还是闰年判断出不符合的即可。除了上述情况就一定是符合日期。

代码如下


import java.io.*;public class Main {static PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.out));static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));static StreamTokenizer st = new StreamTokenizer(br);static int[] days = {0,31,28,31,30,31,30,31,31,30,31,30,31};public static void main(String[] args)throws Exception {int start = nextInt();int end = nextInt();int res = 0;for(int i  = 1000; i < 10000;i++){int date = i;int x = i;for(int j = 0;j < 4;j++){date = date * 10 + x % 10;x /= 10;}if(start <= date && date <= end && check(date)){res++;}}pw.println(res);pw.flush();}public static boolean check(int date){int year = date / 10000;int month = date % 10000 / 100;int day = date % 100;if(month == 0 || month > 12){return false;}if(day == 0 || month != 2 && day > days[month]){return false;}if(month == 2){boolean flag = year % 4 == 0 && year % 100 != 0 || year % 400 == 0;if(flag && day > days[2] + 1 || !flag && day > days[2]){return false;}}return true;}public static int nextInt() throws Exception {st.nextToken();return (int) st.nval;}
}

移动距离

X星球居民小区的楼房全是一样的,并且按矩阵样式排列。
其楼房的编号为 1,2,3…当排满一行时,从下一行相邻的楼往反方向排号。
比如:当小区排号宽度为 6 时,开始情形如下:

1  2  3  4  5  6
12 11 10 9  8  7
13 14 15 .....

我们的问题是:已知了两个楼号 m 和 n,需要求出它们之间的最短移动距离(不能斜线方向移动)。
输入格式
输入共一行,包含三个整数 w,m,n,w 为排号宽度,m,n 为待计算的楼号。
输出格式
输出一个整数,表示 m,n 两楼间最短移动距离。
数据范围
1≤w,m,n≤10000,
输入样例:

6 8 2

输出样例:

4

算法思路

在这里插入图片描述
可以根据二维数组的下标来进行思考,相当于给出了二维数组中对应的值,然后求对应的下标的行和列,求最短距离即求行的差与列的差的和。又因为题目给出的数字与行列的映射关系有很多边界情况,当我们把楼号减一后,所求的映射关系与二维数组下标对应的关系就十分清楚。
此时行号就是楼号 / 宽度即n / w;列号要分两种情况,偶数行是正序的楼号 % 宽度即n % w;奇数行进行反转故是宽度- 1 -正序的列号即 w - 1 - n % ;最后在求最短距离不可斜线就是行号之差的绝对值加上列号之差的绝对值即可。

代码如下

import java.io.*;public class Main {static PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.out));static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));static StreamTokenizer st = new StreamTokenizer(br);static int w,n,m;public static void main(String[] args)throws Exception {w = nextInt();m = nextInt() - 1;n = nextInt() - 1;int x1 = m / w;int x2 = n / w;int y1 = m % w;int y2 = n % w;if(x1 % 2 != 0){y1 = w - 1 - m % w;}if(x2 % 2 != 0){y2 = w - 1 - n % w;}int res = Math.abs(x1 - x2) + Math.abs(y1 - y2);pw.println(res);pw.flush();}public static int nextInt() throws Exception {st.nextToken();return (int) st.nval;}
}

日期问题

小明正在整理一批历史文献。这些历史文献中出现了很多日期。
小明知道这些日期都在1960年1月1日至2059年12月31日。
令小明头疼的是,这些日期采用的格式非常不统一,有采用年/月/日的,有采用月/日/年的,还有采用日/月/年的。
更加麻烦的是,年份也都省略了前两位,使得文献上的一个日期,存在很多可能的日期与其对应。
比如02/03/04,可能是2002年03月04日、2004年02月03日或2004年03月02日。
给出一个文献上的日期,你能帮助小明判断有哪些可能的日期对其对应吗?
输入格式
一个日期,格式是”AA/BB/CC”。
即每个’/’隔开的部分由两个 0-9 之间的数字(不一定相同)组成。
输出格式
输出若干个不相同的日期,每个日期一行,格式是”yyyy-MM-dd”。
多个日期按从早到晚排列。
数据范围
0≤A,B,C≤9
输入样例:

02/03/04

输出样例:

2002-03-04
2004-02-03
2004-03-02

算法思路

在这里插入图片描述
先进行枚举从19600101~20591231,然后跟上述回文日期一样,需要写一个检查是否是合格日期的函数,把年、月、日分别提取出来,然后按照年/月/日、月/日年、日/月/年3中情况与输入的3个数字进行比较,只要符合其中一种情况就是我们需要的结果。

注意年份对应的的输入的后两位

代码如下


import java.io.*;public class Main {static PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.out));static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));static StreamTokenizer st = new StreamTokenizer(br);static int[] days = {0,31,28,31,30,31,30,31,31,30,31,30,31};public static void main(String[] args)throws Exception {String[] s = nextLine().split("/");int a = Integer.parseInt(s[0]);int b = Integer.parseInt(s[1]);int c = Integer.parseInt(s[2]);for(int date = 19600101; date <= 20591231;date++){int year = date / 10000;int month = date % 10000 / 100;int day = date % 100;if(check(year,month,day)){if(year % 100 == a && month == b && day == c || // 年/月/日month == a && day == b && year % 100 == c  ||  // 月/日/年day == a && month == b && year % 100 == c  // 日/月/年){pw.printf("%d-%02d-%02d\n",year,month,day);}}}pw.flush();}public static boolean check(int year,int month,int day){if(month == 0 || month > 12){return false;}if(day == 0 ||  month != 2 && day > days[month]){return false;}if(month == 2){//true为闰年 false为平年boolean flag = year % 4 == 0 && year % 100 != 0 || year % 400 == 0;if(flag && day > days[2] + 1 || !flag && day > days[2] ){return false;}}return true;}public static String nextLine()throws Exception{return br.readLine();}
}

总结

通过这篇博客的学习,我们对回文日期、移动距离和日期问题有了更深入的理解。通过模拟算法,不仅能够解决这些问题,还能够加深我们对编程技巧、数学运算和日期处理的掌握。这些题目虽然看似简单,但在细节处理上却需要我们精确推理和严谨编码。希望通过本博客,大家能够在实际编码中更加灵活地运用这些方法,并提升解决问题的能力。

相关文章:

《从入门到精通:蓝桥杯编程大赛知识点全攻略》(十一)-回文日期、移动距离、日期问题

前言 在这篇博客中&#xff0c;我们将通过模拟的方法来解决三道经典的算法题&#xff1a;回文日期、移动距离和日期问题。这些题目不仅考察了我们的基础编程能力&#xff0c;还挑战了我们对日期处理和数学推理的理解。通过模拟算法&#xff0c;我们能够深入探索每个问题的核心…...

在Uniapp中使用阿里云OSS插件实现文件上传

在开发小程序时&#xff0c;文件上传是一个常见的需求。阿里云OSS&#xff08;Object Storage Service&#xff09;是一个强大的云存储服务&#xff0c;可以帮助我们高效地存储和管理文件。本文将介绍如何在Uniapp小程序中使用阿里云OSS插件实现文件上传功能。 1. 准备工作 首…...

9 数据流图

9 数据流图 9.1数据平衡原则 子图缺少处理后的数据操作结果返回前端应用以及后端数据库返回操作结果到数据管理中间件。 9.2解题技巧 实件名 存储名 加工名 数据流...

IDEA查看项目依赖包及其版本

一.IDEA将现有项目转换为Maven项目 在IntelliJ IDEA中,将现有项目转换为Maven项目是一个常见的需求,可以通过几种不同的方法来实现。Maven是一个强大的构建工具,它可以帮助自动化项目的构建过程,管理依赖关系,以及其他许多方面。 添加Maven支持 如果你的项目还没有pom.xm…...

【数据结构】_栈与队列经典算法OJ:栈与队列的互相实现

目录 1. 用队列实现栈 1.1 题目链接及描述 1.2 解题思路 1.3 程序 2. 用栈实现队列 2.1 题目链接及描述 2.2 解题思路 2.3 程序 1. 用队列实现栈 1.1 题目链接及描述 1. 题目链接 &#xff1a; 225. 用队列实现栈 - 力扣&#xff08;LeetCode&#xff09; 2. 题目描…...

SAP-ABAP:ROLLBACK WORK使用详解

在SAP ABAP 中&#xff0c;ROLLBACK WORK 语句用于回滚当前事务&#xff08;LUW&#xff0c;Logical Unit of Work&#xff09;&#xff0c;撤销自上次提交或回滚以来的所有数据库更改。它通常与 COMMIT WORK 配合使用&#xff0c;确保数据一致性。 关键点&#xff1a; 回滚作…...

DeepSeek R1 Distill Llama 70B(免费版)API使用详解

DeepSeek R1 Distill Llama 70B&#xff08;免费版&#xff09;API使用详解 在人工智能领域&#xff0c;随着技术的不断进步&#xff0c;各种新的模型和应用如雨后春笋般涌现。今天&#xff0c;我们要为大家介绍的是OpenRouter平台上提供的DeepSeek R1 Distill Llama 70B&…...

如何避免大语言模型中涉及丢番图方程的问题

希尔伯特第十问题是一个著名的数学问题,涉及不定方程(又称为丢番图方程)的可解答性。然而在大模型中,我们希望问题都是确定的可解的,或者说要尽可能的想办法避免不确定的不可解问题。由于丢番图方程问题是不可判定问题(即不存在一个有效的算法能够解决该类问题的所有实例…...

flutter 获取网络图片的尺寸

获取网络图片的尺寸 import dart:async;import package:flutter/widgets.dart;/// Image Util. class ImageUtil {late ImageStreamListener _listener;late ImageStream _imageStream;/// get image width height&#xff0c;load error throw exception.&#xff08;unit px…...

MySQL主从同步+binlog

一、简介 MySQL内建的复制功能是构建大型&#xff0c;高性能应用程序的基础 通过将MySQL的某一台主机&#xff08;master&#xff09;的数据复制到其他主机&#xff08;slaves&#xff09;上&#xff0c;并重新执行一遍来执行 复制过程中一台服务器充当主服务器&#xff0c;而…...

实践深度学习:构建一个简单的图像分类器

引言 深度学习在图像识别领域取得了巨大的成功。本文将指导你如何使用深度学习框架来构建一个简单的图像分类器&#xff0c;我们将以Python和TensorFlow为例&#xff0c;展示从数据准备到模型训练的完整流程。 环境准备 在开始之前&#xff0c;请确保你的环境中安装了以下工…...

蔚来C++面试题及参考答案

栈了解吗? 栈在计算机科学中是一种重要的数据结构,在 C++ 编程里有不同层面的体现,分别是数据结构层面和内存管理层面。 从数据结构角度来看,栈遵循后进先出(LIFO)的原则。就像一摞盘子,最后放上去的盘子总是最先被拿走。在 C++ 标准模板库(STL)中,提供了std::stac…...

C# Winform怎么设计串口,客户端和相机控件界面显示

首先我们必须把这个类创建好 INIAPI using System; using System.Text; using System.Runtime.InteropServices;namespace Ini {public class IniAPI{#region INI文件操作/** 针对INI文件的API操作方法&#xff0c;其中的节点&#xff08;Section)、键&#xff08;KEY&#x…...

C++字符串相关内容

字符串 字符串&#xff0c;本质上是一个接一个字符的一组字符。字母、数字、符号等。 const char* 字符串名 字符后面会有一个空终止符&#xff0c;为0。 字符串从指针的内存地址开始&#xff0c;然后继续下去&#xff0c;直到它碰到0&#xff0c;然后意识到字符串终止了。 …...

利用二分法进行 SQL 时间盲注

什么是时间盲注&#xff1f; SQL 盲注&#xff08;Blind SQL Injection&#xff09;是一种常见的 Web 安全漏洞&#xff0c;其中时间盲注是基于查询延迟的 SQL 注入方式。当服务器不返回可见的错误信息时&#xff0c;我们可以利用 SLEEP() 函数来判断查询结果是否符合预期。 …...

数据库管理-第293期 奇怪的sys.user$授权+(20250210)

数据库管理293期 2025-02-10 数据库管理-第293期 奇怪的sys.user$授权&#xff08;20250210&#xff09;1 清空shared pool2 SR反馈总结 数据库管理-第293期 奇怪的sys.user$授权&#xff08;20250210&#xff09; 作者&#xff1a;胖头鱼的鱼缸&#xff08;尹海文&#xff09…...

react实例与总结(一)

目录 一、简单认识 1.1、特点 1.2、JSX语法规则 1.3、函数组件和类式组件 1.4、类组件三大属性state、props、refs 1.4.1、state 1.4.2、props 1.4.3、refs 1.5、事件处理 1.6、收集表单数据—非受控组件和受控组件 1.7、高阶函数—函数柯里化 1.8、生命周期—新旧…...

电路研究9.3——合宙Air780EP中的AT开发指南(含TCP 示例)

根据合宙的AT研发推荐&#xff0c; AT指令基本上也简单看完了&#xff0c;这里开始转到AT的开发了。 AT 命令采用标准串口进行数据收发&#xff0c;将以前复杂的设备通讯方式转换成简单的串口编程&#xff0c; 大大简化了产品的硬件设计和软件开发成本&#xff0c;这使得几乎所…...

Qt 数据库SQLite 使用【01】基本功能

1.开发背景 Qt 开发过程中难免需要存储数据&#xff0c;可以选择保存到本地文件&#xff0c;但是查找比较麻烦&#xff0c;所以就有了数据库&#xff0c;主要是方便查找数据&#xff0c;增删改查等操作&#xff0c;而 SqLite 属于数据库中轻量级的存在&#xff0c;适合本地数据…...

stm32小白成长为高手的学习步骤和方法

我们假定大家已经对STM32的书籍或者文档有一定的理解。如不理解&#xff0c;请立即阅读STM32的文档&#xff0c;以获取最基本的知识点。STM32单片机自学教程 这篇博文也是一篇不错的入门教程&#xff0c;初学者可以看看&#xff0c;讲的真心不错。 英文好的同学&#xf…...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils&#xff1a; ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类&#xff0c;封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz&#xff0c;先构建任务的 JobD…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行

项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战&#xff0c;克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

Golang——9、反射和文件操作

反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一&#xff1a;使用Read()读取文件2.3、方式二&#xff1a;bufio读取文件2.4、方式三&#xff1a;os.ReadFile读取2.5、写…...

探索Selenium:自动化测试的神奇钥匙

目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...

Rust 开发环境搭建

环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行&#xff1a; rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu ​ 2、Hello World fn main() { println…...

mac:大模型系列测试

0 MAC 前几天经过学生优惠以及国补17K入手了mac studio,然后这两天亲自测试其模型行运用能力如何&#xff0c;是否支持微调、推理速度等能力。下面进入正文。 1 mac 与 unsloth 按照下面的进行安装以及测试&#xff0c;是可以跑通文章里面的代码。训练速度也是很快的。 注意…...