蓝桥杯2020年第十一届省赛真题-回文日期python两种方法题解(贪心+datetime)

news2024/11/18 21:48:27

题目

原题链接:回文日期 - 蓝桥云课 (lanqiao.cn)

题目描述

2020 年春节期间,有一个特殊的日期引起了大家的注意:2020 年 2 月 2 日。因为如果将这个日期按 “yyyymmdd” 的格式写成一个 8 位数是 20200202,恰好是一个回文数。我们称这样的日期是回文日期。

有人表示 20200202 是 “千年一遇” 的特殊日子。对此小明很不认同,因为不到 2 年之后就是下一个回文日期:20211202 即 2021 年 12 月 2 日。

也有人表示 20200202 并不仅仅是一个回文日期,还是一个 ABABBABA 型的回文日期。对此小明也不认同,因为大约 100 年后就能遇到下一个 ABABBABA 型的回文日期:21211212 即 2121 年 12 月 12 日。算不上 “千年一遇”,顶多算 “千年两遇”。

给定一个 8 位数的日期,请你计算该日期之后下一个回文日期和下一个 ABABBABA 型的回文日期各是哪一天。

输入描述

输入包含一个八位整数 N,表示日期。

对于所有评测用例,10000101≤N≤89991231,保证 N 是一个合法日期的 8 位数表示。

输出描述

输出两行,每行 1 个八位数。第一行表示下一个回文日期,第二行表示下一个 ABABBABA 型的回文日期。

输入输出样例

示例

输入

20200202

输出

20211202
21211212

 datetime遍历

使用python标准库中的datetime库可以很方便地处理有关日期类问题的遍历。

import datetime

N=input()
year=int(N[:4])
month=int(N[4:6])
day=int(N[6:])

cur_date=datetime.date(year,month,day)
had_print_once=False # 已输出回文日期
while True:
    cur_date=cur_date+datetime.timedelta(days=1)
    str_date=str(cur_date).replace('-','')
    if str_date==str_date[::-1]:
        if not had_print_once:
            had_print_once=True
            print(str_date)
        if str_date[0]==str_date[2] and str_date[1]==str_date[3]:
            print(str_date)
            break
        

贪心

此方法求出的局部最优解就是全局最优解,复杂度为O(1),比赛的时候不推荐使用,把简单的问题复杂化了,不过平时玩玩图一乐挺好。

代码主要由分成两部分:找下一个回文日期和找下一个ABABBABA 型的回文日期。

先说下一个ABABBABA 型的回文日期,这个比较简单。通过观察可以发现,由于受月份限制,BA的组合一共有十二个,分别为01到12。把这些组合里的数字倒序,之后对这些组合进行排序得到AB的有序组合。对AB有序组合里的元素进行遍历,可求出目标回文日期。

再说找下一个回文日期。程序简图如图1

图1

其中贪心策略求最小年份的过程见图2。其中第一次判倒转日是否修改使用的是>31这个条件,所以后续判断月是否要修改的时候,无论月有没有改变使日要”进位“,都需要通过已确定的月份用新的约束判断日是否需要修改。

再者说,二月份的天数限制定为28是可行的。为什么呢?首先,题目给了N≤89991231,所以不会出现倒转后天数的个位数为9的情况。会出现倒转后天数为9的情况,只有当日的个位数为8,又不是合法日期的情况,此时日变为”09“,不可能出现29。所以,二月份天数限制为28是可行的。

图2 

def gen_ABABBABA(AB):
    return AB+AB+AB[::-1]+AB[::-1]

N=input()
li=list(N)#列表是可变类型,通过列表储存N的各位

# 输入的N是回文数,需要使它变成最小的非回文数,此时不需要考虑合法性
if li[:4]==li[-1:3:-1]:
    li[-1]=str(int(li[-1])+1)

# 寻找下一个最小的回文数

# 判断N前四位倒转后是否比后四位大
if int("".join(li[:4]))<int("".join(li[-1:3:-1])):
    li[3]=str(int(li[3])+1)

# 判断合法
had_change=False
rev_first_four=li[:4]
rev_first_four.reverse()
# 先判断倒转后的日
raw_bound_day=31
if int("".join(rev_first_four[2:4]))>raw_bound_day:
    rev_first_four[2]='0'
    rev_first_four[3]=str(int(rev_first_four[3])+1)
    had_change=True
if had_change:
    rev_first_four[0]='1'
    rev_first_four[1]='0'
else:
    if int("".join(rev_first_four[0:2]))>12:
        rev_first_four[0]='0'
        rev_first_four[1]=str(int(rev_first_four[1])+1)
        if int(rev_first_four[1])==10:
            rev_first_four[1]='0'
            rev_first_four[2]=str(int(rev_first_four[2])+1)
    if int("".join(rev_first_four[0:2]))==0:
        rev_first_four[0]='1'

    days=[0,31,28,31,30,31,30,31,31,30,31,30,31] # 每月天数
    bound_day=days[int("".join(rev_first_four[0:2]))]# 当前月天数限制
    if int(rev_first_four[2])==10:
        rev_first_four[2]='0'
        rev_first_four[3]=str(int(rev_first_four[3])+1)
    if int("".join(rev_first_four[2:4]))>bound_day:
        rev_first_four[2]='0'
        rev_first_four[3]=str(int(rev_first_four[3])+1)

print("".join(rev_first_four[::-1])+"".join(rev_first_four[:]))

# 寻找下一个ABABBABA型的回文日期
BA=[str(i).zfill(2) for i in range(1,13)];
AB=[i[::-1] for i in BA]
AB.sort()
raw_year_first_two=int("".join(li[:2]))
for snum in AB:
    if int(snum)<raw_year_first_two:
        continue
    if int(snum)==raw_year_first_two:
        if int(gen_ABABBABA(snum))>int("".join(li)):
            print(gen_ABABBABA(snum))
            break
    else:
        print(gen_ABABBABA(snum))
        break
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/541725.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何系统自学黑客(网络安全)?

前言&#xff1a; 黑客技能是一项非常复杂和专业的技能&#xff0c;需要广泛的计算机知识和网络安全知识。下面是一些你可以参考和学习的步骤&#xff0c;以系统自学黑客&#xff08;网络安全&#xff09;&#xff1a; 在学习之前&#xff0c;要给自己定一个目标或者思考一下…

SpringBoot日志配置(四十七)

当一切被遗忘&#xff0c;那么就回到最初的地方 上一章简单介绍了SpringBoot配置文件敏感信息加密(四十六) , 如果没有看过,请观看上一章 这一章节&#xff0c;我们学习一下日志配置. 参考文章: Spring Boot 日志配置(超详细) 一. 日志配置处理 我们创建一个普通的 SpringB…

docker-compose 实现Seata Server高可用部署 | Spring Cloud 51

一、前言 Seata 是一款开源的分布式事务解决方案&#xff0c;致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式&#xff0c;为用户打造一站式的分布式解决方案。 TC (Transaction Coordinator) - 事务协调者 维护全局和分支事…

excel根据不同分类动态设置不同下拉列列表

有这样一个需求&#xff0c;有很多个系统&#xff0c;需要在excel中下拉选择其系统一级分类、二级分类、三级分类&#xff0c;不同的一级分类对应不同的二级分类列表&#xff0c;不同的二级分类对应不同的三级分类列表。 针对这个需求&#xff0c;我们采用了excel/wps中的数据…

数据结构总结7:并查集、图

后续会有补充 并查集 查你在哪个集合&#xff0c;在有一定交集情况下会合并集合 可应用的场景&#xff1a; 1.分组 2.已有集合合并 并查集就是把一组数据分组&#xff0c;把有共同特征的元素以树的形式放在一组 仔细观察数组中内融化&#xff0c;可以得出以下结论&#x…

【数据结构和算法】数据结构基础和算法思想

文章目录 1. 基础的一些数据结构&#xff08;1&#xff09;数组&#xff08;2&#xff09;链表&#xff08;3&#xff09;二叉树&#xff08;4&#xff09;哈希表 2. 有哪些常见的算法思想&#xff1f;3. 常见排序算法及其复杂度 1. 基础的一些数据结构 &#xff08;1&#xf…

java多线程之定时器

文章目录 一、 简介1. 概念2. 定时器的使用 二、 常用方法介绍1. Schedule(TimTask task,Data time&#xff09;2. Schedule(TimTask task,Data firstTime, long period&#xff09;3. Schedule(TimTask task, long delay&#xff09;4. Schedule(TimTask task, long delay, lo…

数据结构_排序

目录 1. 排序的基本概念 2. 插入排序 2.1 直接插入排序 2.2 折半插入排序 2.3 希尔排序 2.4 相关练习 3. 交换排序 3.1 冒泡排序 3.2 快速排序 3.3 相关练习 4. 选择排序 4.1 简单选择序列 4.2 堆排序 4.3 相关练习 5. 归并排序和基数排序 5.1 归并排序 5.2 基…

这几款实用的电脑软件推荐给你

软件一&#xff1a;TeamViewer TeamViewer是一款跨平台的远程控制软件&#xff0c;它可以帮助用户远程访问和控制其他计算机、服务器、移动设备等&#xff0c;并且支持文件传输、会议功能等。 TeamViewer的主要功能包括&#xff1a; 远程控制&#xff1a;支持远程访问和控制…

【Jenkins】Jenkins运行python脚本的简单操作(windows)

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化 &#x1f449;专__注&#x1f448;&#xff1a;专注主流机器人、人工智能等相关领域的开发、…

Vue基础入门(中)

组件的定义 组件具备复用性 注意&#xff1a;全局组件&#xff0c;只要定义了&#xff0c;处处可以使用&#xff0c;性能不高&#xff0c;但是使用起来简单 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><me…

Linux下的用户分类与su/sudo 命令,Linux下的文件类型/用户文件权限身份/文件权限属性/权限与文件权限/ls-l文件属性详解

Tips 下载就是把我们的文件拷贝到系统的某个特定路径之下&#xff0c;普通用户是不允许你往系统里面去拷的。 Linux下的用户分类 root用户&#xff0c;管理员级别的用户身份&#xff0c;他的话基本上不受权限的约束。普通用户&#xff0c;普通用户的添加与每个普通用户密码的…

《面试1v1》JavaNIO

我是 javapub&#xff0c;一名 Markdown 程序员从&#x1f468;‍&#x1f4bb;&#xff0c;八股文种子选手。 面试官&#xff1a; 你好&#xff0c;我想问一下你对 Java NIO 的了解。 候选人&#xff1a; 当然&#xff0c;Java NIO 是 Java 的一种 I/O 模型&#xff0c;它提…

MapReduce【自定义分区Partitioner】

实际开发中我们可能根据需求需要将MapReduce的运行结果生成多个不同的文件&#xff0c;比如上一个案例【MapReduce计算广州2022年每月最高温度】&#xff0c;我们需要将前半年和后半年的数据分开写到两个文件中。 默认分区 默认MapReduce只能写出一个文件&#xff1a; 因为我…

「OceanBase 4.1 体验」OceanBase:解读领先的分布式数据库系统,功能与体验全解析

文章目录 前言一、关于 【OceanBase 4.1】征文活动&#xff08;可跳过&#xff09;二、OceanBase 产品了解2.1 初识 OceanBase2.2 什么是 OceanBase2.3 OceanBase 相关链接2.4 OceanBase 与传统数据库对比有何特别之处2.5 OceanBase 相关概念以及术语2.5.1 OceanBase 基本概念2…

接口测试总结及其用例设计方法整理,希望可以帮到你

目录 接口测试的总结文档 第一部分&#xff1a; 第二部分&#xff1a; 接口测试用例设计 接口测试的总结文档 第一部分&#xff1a;主要从问题出发&#xff0c;引入接口测试的相关内容并与前端测试进行简单对比&#xff0c;总结两者之前的区别与联系。但该部分只交代了怎么做…

ios中video标签兼容问题

案例 这是在实际开发中遇到的问题,产品给出的效果图如下: 其实就是一个h5页面中有很多视频, 但是我为什么都画着预览图呢? 因为在ios中video标签中尽管有src属性, 但是在没有预览图的情况下, 是一个灰蒙蒙的图层的, 很丑, 效果如下: 看到这里是不是很崩溃, 在PC端, 在安卓端…

RK3568平台开发系列讲解(Camera篇)快速了解RK Camera的使用

🚀返回专栏总目录 文章目录 一、MIPI CSI1.1 Full Mode特点1.2 Split Mode特点二、Full Mode配置2.1 配置sensor端2.2 csi2_dphy0相关配置2.3 isp相关配置三、Split Mode配置3.1 配置sensor端3.2 csi2_dphy1/csi2_dphy2相关配置3.3 isp相关配置四、软件相关目录

自然语言处理实战项目7-利用层次聚类方法做文本的排重,从大量的文本中找出相似文本

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下自然语言处理实战项目7-利用层次聚类方法做文本的排重&#xff0c;从大量的文本中找出相似文本。随着互联网技术的不断发展&#xff0c;越来越多的数据被广泛地应用在各个领域中。而文本数据是其中之一&#xff0c;…

ar在汽车维修行业的应用场景

由于AR增强现实技术的易用性&#xff0c;在汽车产业链中&#xff0c;已处处可见AR技术的踪影&#xff0c;像汽车设计AR远程协同&#xff0c;汽车装配AR远程指导&#xff0c;汽车维修AR远程协助等等&#xff0c;那么下面为详细介绍AR增强现实技术在汽车制造领域的应用。 环境/物…