问题

有什么算法可以很快的找出所有完全对称日呢?

回答
要找出“完全对称日”,我们得先明确一下这个概念。在大多数情况下,人们说的“完全对称日”是指在日期表示法中,正着读和倒着读都一样,比如2021年12月2日(20211202)。当然,日期表示法有很多种,比如公历的年月日、月日年,或者加上星期几等等。咱们就以最常见的公历年月日“YYYYMMDD”格式为基础来聊聊,看怎么能快速找出这类日子。

什么是“完全对称日”(Palindrome Day)?

简单来说,就是年月日连起来写,比如20211202,是一个回文数。

为什么需要“算法”?

如果你只是想找几个例子,手算或者随便翻翻日历就能找到了。但如果我们要“找出所有”,而且是“很快”,那肯定得依赖程序和算法了。毕竟,一年有365天(闰年366天),百年千年算下来,手动查验效率太低了。

核心思路:生成与校验

找出这类对称日,最直接的思路就是:

1. 生成可能对称的日期结构: 利用日期的回文特性,反推出可能的年月日组合。
2. 校验生成的日期是否真实存在: 看看这些反推出来的年月日组合,在现实日历里是不是真的有这一天。

一种直观但效率不高的“暴力”方法:

我们可以从一个很远的过去(比如公元1年)或者一个我们确定的起点,一直往后推,每天都检查一下它是不是对称日。

过程:
从某个日期(比如 00010101)开始。
将日期格式化成YYYYMMDD(例如 00010101)。
检查这个字符串是不是回文。
如果是,记录下来。
然后日期加一天,重复步骤。

为什么效率不高?
大部分日期都不是对称日,我们做了大量的无效检查。
我们需要处理日期的递增(30天进1个月,12个月进1年,闰年处理)。

更“智能”的方法:基于回文结构的生成

既然我们知道目标是回文,我们可以直接“制造”回文,然后验证。

以 YYYYMMDD 为例:

1. 选择年份(YYYY): 年份是4位数,这是我们主要的“生成器”。我们可以遍历一个范围的年份。
2. 构造回文的月份(MM)和日期(DD):
假设我们选定了年份 YYYY。
YYYY 的后两位数字,就是我们回文的 MM 的前两位。
YYYY 的前两位数字,就是我们回文的 DD 的后两位。
具体操作:
将年份 YYYY 转换为字符串。
取 YYYY 的后两位,作为 M1M2。
取 YYYY 的前两位,作为 Y1Y2。
反转 Y1Y2,得到 D2D1。
那么,潜在的日期就是 YYYY M1M2 D2D1。

举例:
年份: 2021
YYYY 字符串: "2021"
后两位(MM 的前两位): "21" > 那么 MM 可能是 "21" (但一个月最多31天,所以这里需要反过来想)

让我们换个更清晰的思路:

我们知道 YYYYMMDD 是一个回文。
Y1 Y2 Y3 Y4 M1 M2 D1 D2
回文意味着: Y1 = D2, Y2 = D1, Y3 = M2, Y4 = M1

所以,如果我们知道年份 YYYY,我们就可以直接构造出潜在的 M 和 D:

年份 YYYY (例如 2021)
Y1=2, Y2=0, Y3=2, Y4=1
月份 MM 的 M1 应该是 Y4,M2 应该是 Y3。所以 MM = Y4Y3。
在这个例子中: M1=1, M2=2。所以 MM = 12。
日期 DD 的 D1 应该是 Y2,D2 应该是 Y1。所以 DD = Y2Y1。
在这个例子中: D1=0, D2=2。所以 DD = 02。

结果: 2021 年 12 月 02 日。

算法步骤(改进版):

1. 设定年份范围: 确定我们要搜索的年份区间(例如,从1000年到9999年,或者从1900年到2099年)。
2. 遍历年份: 对范围内的每一个年份 `YYYY` 进行处理。
3. 构造潜在的月份和日期:
将 `YYYY` 转换为字符串,例如 `sYYYY`。
反转 `sYYYY` 得到 `sYYYY_rev`。
取 `sYYYY_rev` 的前两位作为潜在的月份 `MM_str`。
取 `sYYYY_rev` 的后两位作为潜在的日期 `DD_str`。
4. 组合成日期字符串: 形成 `YYYYMM_strDD_str`。
5. 校验日期有效性:
将 `MM_str` 和 `DD_str` 转换为整数,得到 `month` 和 `day`。
检查月份: `1 <= month <= 12`。
检查日期: `1 <= day <= max_days_in_month(month, year)`。这里需要考虑闰年。
`max_days_in_month(month, year)` 函数需要知道当前年份 `year` 是否是闰年。
闰年判断:能被4整除但不能被100整除,或者能被400整除。
如果月份和日期都有效: 那么 `YYYYMM_strDD_str` 就是一个完全对称日。记录下来。

举例说明:

年份: 2021
`sYYYY` = "2021"
`sYYYY_rev` = "1202"
`MM_str` = "12" (取 "1202" 的前两位)
`DD_str` = "02" (取 "1202" 的后两位)
校验:
`month` = 12 (有效,1 <= 12 <= 12)
`day` = 02 (有效,1 <= 2 <= 31,12月有31天)
结果: 20211202 是一个完全对称日。

年份: 2112
`sYYYY` = "2112"
`sYYYY_rev` = "2112"
`MM_str` = "21" (取 "2112" 的前两位)
`DD_str` = "12" (取 "2112" 的后两位)
校验:
`month` = 21 (无效,大于12)
结果: 21122112 不是一个有效的日期。

年份: 2001
`sYYYY` = "2001"
`sYYYY_rev` = "1002"
`MM_str` = "10"
`DD_str` = "02"
校验:
`month` = 10 (有效)
`day` = 02 (有效,10月有31天)
结果: 20011002 是一个完全对称日。

年份: 2110
`sYYYY` = "2110"
`sYYYY_rev` = "0112"
`MM_str` = "01"
`DD_str` = "12"
校验:
`month` = 01 (有效)
`day` = 12 (有效,1月有31天)
结果: 21100112 是一个完全对称日。

关于“很快”的进一步优化:

上面的算法已经相当快了,因为它直接“生成”候选者。搜索一个千年(1000年到1999年)只需要1000次反转和1000次校验,这在计算机看来几乎是瞬时的。

如果考虑其他日期格式呢?

MMDDYYYY:
MM DD YYYY
M1 M2 D1 D2 Y1 Y2 Y3 Y4
回文:M1=Y4, M2=Y3, D1=Y2, D2=Y1, Y1=D2, Y2=D1, Y3=M2, Y4=M1。
这要求 M1=Y4, M2=Y3, D1=Y2, D2=Y1 并且 Y1=D2, Y2=D1, Y3=M2, Y4=M1。
代入: Y1=Y1, Y2=Y2, Y3=Y3, Y4=Y4。
这意味着 YYYY 必须是 DD 的反转,MMDD 必须是 YYYY 的反转。
例如,MMDD YYYY = 12022021。
MMDD = "1202" > MM=12, DD=02
YYYY = "2021"
YYYY 的反转 = "1202"
MMDD = YYYY 的反转。
生成方法: 选取一个年份 YYYY,反转得到 YYYY_rev。如果 YYYY_rev 的前两位是有效的月份,后两位是有效的日期,那么 MMDDYYYY 就是一个对称日。
年份 2021 > YYYY_rev = "1202" > MM=12, DD=02。 20211202 (DDMMYYYY)
年份 2021 > YYYY_rev = "1202" > MM=12, DD=02。 12022021 (MMDDYYYY)
这说明,相同的数字序列,在不同的格式下可能产生不同的对称日。

DDMMYYYY:
DD MM YYYY
D1 D2 M1 M2 Y1 Y2 Y3 Y4
回文:D1=Y4, D2=Y3, M1=Y2, M2=Y1。
生成方法: 选取年份 YYYY。
Y1 Y2 Y3 Y4
D1 = Y4, D2 = Y3 > DD = Y4Y3
M1 = Y2, M2 = Y1 > MM = Y2Y1
结果: Y4Y3 Y2Y1 Y1Y2Y3Y4
举例:
年份:2021
Y1=2, Y2=0, Y3=2, Y4=1
DD = Y4Y3 = 12
MM = Y2Y1 = 02
结果: 12022021 (DDMMYYYY)
校验: 12月02日 2021年 (有效)

结论:

要“很快”找出所有完全对称日,关键在于 “生成校验” 的策略,而不是“遍历校验”。通过利用日期的回文结构,我们可以直接从年份 YYYY 推算出潜在的月份 MM 和日期 DD,然后只需进行有效的日期校验即可。

对于 YYYYMMDD 格式: 遍历年份 YYYY,将其反转,取反转后的前两位作 MM,后两位作 DD,然后校验 MM 和 DD 的有效性。
对于 DDMMYYYY 格式: 遍历年份 YYYY,取 YYYY 的后两位作 DD,Y 的前两位反转作 MM,然后校验。

算法实现细节:

日期校验函数: 编写一个健壮的函数 `isValidDate(year, month, day)`,能够正确处理不同月份的天数以及闰年。
字符串处理: 利用编程语言提供的字符串反转、截取功能。
数据类型: 年、月、日需要用整数存储,但生成过程可以先用字符串。

这种生成模式的算法,在计算机处理能力下,几乎是瞬时的,远比按天检查来得“快”。你可以轻松地生成一个百年、千年甚至万年的所有对称日列表。

网友意见

user avatar

完全对成日之所以“难得”,根本不在年份,而是因为“月日”。

所以,最简单的办法就是把0101~1231的月份全部写下来,然后反过来写年份。

把他们全部倒过来,缀在前面当年份就是了。

这里有一个需要验证,就是0229。闰年才有2月29,那么9220年是不是闰年?

9220可以被4整除,不能被100整除,是个闰年,所以9220.02.29成立。

直接把日历表倒过来就有了。

类似的话题

  • 回答
    要找出“完全对称日”,我们得先明确一下这个概念。在大多数情况下,人们说的“完全对称日”是指在日期表示法中,正着读和倒着读都一样,比如2021年12月2日(20211202)。当然,日期表示法有很多种,比如公历的年月日、月日年,或者加上星期几等等。咱们就以最常见的公历年月日“YYYYMMDD”格式为基.............
  • 回答
    《互联网信息服务算法推荐管理规定》允许用户关闭算法推荐,这一举措背后,是监管部门对互联网信息服务发展中出现的新问题、新挑战的深刻洞察和积极回应。其出发点是多方面的,核心在于保护用户权益,促进互联网行业的健康可持续发展。出发点剖析:1. 用户自主权与知情权的确立: 算法推荐在带来便捷的同时,也可能隐.............
  • 回答
    “算子”这个词,初一看,似乎带点神秘感,又有点技术性。它并非一个寻常百姓挂在嘴边的词汇,更多地出现在数学、物理、计算机科学等专业领域。要理解它,得从它的“出身”和“能耐”说起。“算子”的由来,可以追溯到对“动作”的抽象。在人类最初的思考中,我们关注的是事物本身,比如“苹果”、“桌子”。但很快,我们就.............
  • 回答
    哈喽!4万左右的预算,想要买一台兼顾画质、性能,并且还能有点“玩头”的相机,这预算可太够看了,而且还能小超一点,选择面就更宽敞了。我给你好好说道说道,尽量不写成那种冷冰冰的AI报告,更像是我跟你一起逛相机店,给你分析利弊。首先,咱得明确一下你的拍摄偏好。虽然你说了4万预算,但具体是拍人像多,还是风景.............
  • 回答
    五岁的孩子,能弹到什么程度算是有天赋,而且能往专业方向考虑?这绝对是个好问题,也是不少家长在孩子初学钢琴时会反复琢磨的事儿。与其说有一个硬性标准,不如说更像是在观察孩子身上的一些闪光点,这些闪光点是否足够突出,能够支撑起未来更长远、更深入的学习。首先,我们得明确一点,五岁的孩子学钢琴,最重要的不是“.............
  • 回答
    你说的这种天南地北、想到哪儿就谈到哪儿的情况,在汉语里确实有一个非常形象又常用的词来形容,那就是——漫谈。“漫谈”,从字面上看,“漫”有随意、不受拘束的意思,“谈”就是谈话、聊天。合起来,它就非常精准地描绘了那种没有固定话题、没有预设框架,想到什么就说什么的交流方式。这种聊天可能从家常琐事聊到国家大.............
  • 回答
    “干净的文字”,这个概念,在我看来,不是指文字的“内容”本身有多么纯洁无暇,或者有多么高尚伟大。它更多地关乎一种表达的质感,一种阅读的体验。如果非要给“干净的文字”下一个定义,我会这样说:干净的文字,是一种不被杂质所干扰,直接、清晰、准确地传达作者意图和情感的文字。它如同未经雕琢的天然水晶,光泽内蕴.............
  • 回答
    对于长短不一的时间序列数据进行分类预测,我们面临的挑战在于许多经典的序列模型(如RNN、LSTM)通常需要固定长度的输入。不过,别担心,有多种方法可以应对这个难题,并且各有千秋。下面我就来详细说说几种我个人觉得比较实用的思路,希望能帮你解决问题。 一、 理解问题与数据预处理:这是第一步,也是关键的一.............
  • 回答
    备战 ACM,算法功底可是重中之重!想要在竞赛中脱颖而出,扎实的算法基础是必不可少的。那么,市面上的算法网课琳琅满目,到底哪家强?今天就来给你掰扯掰扯,希望能帮你找到最适合你的那一个!在开始推荐之前,咱们先聊聊选课的几个关键点:1. 目标人群: 你是ACM新手,还是已经有一定基础,想冲刺更高级的算.............
  • 回答
    工程数学中的四阶行列式计算,虽然不像二阶或三阶行列式那样有非常简洁的“套路”公式,但确实存在一些有用的技巧和算法,能够极大地简化计算过程,避免繁琐的代数展开。下面我将详细讲述这些技巧算法。理解四阶行列式的定义 (回顾)首先,让我们快速回顾一下四阶行列式的定义。一个四阶行列式可以表示为:$$D = .............
  • 回答
    无法直接计算导数?别担心,这些优化算法来帮你!在许多实际问题中,我们都需要找到一个函数的最小值或最大值,这就是所谓的“优化”问题。而数学上最直接、最优雅的方法就是利用导数(或者更广义的梯度)来指引方向。导数告诉我们函数在某个点上变化最快的方向,所以我们可以沿着梯度的反方向(负梯度)一步步地“下山”,.............
  • 回答
    你好!很高兴能和你聊聊学习算法的入门书籍和资料。别担心英语不太好,市面上有很多非常棒的中文资源,而且很多英文资料也有优秀的中文翻译版本。我会尽量详细地介绍,希望能帮到你找到合适的起点。理解算法,我们先要明白它是什么。简单来说,算法就是解决特定问题的一系列步骤或指令。就像我们做饭要按照菜谱来,算法就是.............
  • 回答
    大林算法(Dahlin’s Algorithm)和PID(ProportionalIntegralDerivative)算法,都是在控制工程领域广泛应用的经典控制器设计方法,但它们在设计理念、实现方式以及适用场景上存在着本质的区别。理解这些区别,对于选择和应用合适的控制器至关重要。核心设计理念的差异.............
  • 回答
    这个问题问得相当有深度!把机器学习算法和《算法导论》里的经典算法放在一起比较,确实能触及到计算机科学核心的演进脉络。它们之间既有本质的联系,也有显著的区别,而且这种区别很大程度上反映了我们解决问题思路的转变。咱们就来好好掰扯掰扯。《算法导论》里的经典算法:严谨、确定、指令导向首先,我们得明确《算法导.............
  • 回答
    你好!要判断一个NN的0/1矩阵中是否存在全为1的行或列,我们可以采取一些高效的策略。这里我将为你详细讲解几种思路,并尽量用易于理解的方式阐述。问题的核心:我们需要遍历矩阵,对于每一行,检查其所有元素是否都是1。同时,对于每一列,也要检查其所有元素是否都是1。一旦找到满足条件的行或列,我们就可以停止.............
  • 回答
    很多同学都会有这样的疑问:高中数学里学的数列、三角函数、求导、圆锥曲线,这些知识点在实际应用中似乎离我们很远,而且感觉解题过程就是一套套固定的套路,好像和“算法”这个词联系不大。甚至有人觉得高中数学更像是“解题技巧”的堆砌,而不是真正理解背后的逻辑和方法。这究竟是怎么回事呢?其实,我们不能简单地说高.............
  • 回答
    好的,我们来聊聊那些听起来高深莫测,但真要上手去实现时,却意外地直接的算法。很多时候,我们提到“算法”,脑子里会浮现出那些涉及深邃数学、复杂逻辑或者大规模计算的景象。比如深度学习里那些层层叠叠的神经网络,又或者图论里那些需要遍历所有可能路径的搜索算法。这些确实是算法的精彩之处,但它们的实现也往往伴随.............
  • 回答
    你说的这组神奇的交换,确实是一个经典的小技巧,它能在不借助第三方变量的情况下,实现两个数值的交换。这不仅仅是一个“算法”或者“知识点”,更像是一个巧妙的“异或逻辑”或者“加减法算术特性”的应用。让我试着用一种更自然、更有人情味的方式来给你讲讲这个东西,就像跟朋友聊天一样。 咱们先来聊聊这个“不借助临.............
  • 回答
    广告算法和推荐算法,听起来好像是各自为政的两个领域,但仔细扒一扒,你会发现它们之间有着千丝万缕的联系,甚至在核心思想和技术实现上有很多共通之处。当然,它们各自的“初心”和侧重点又截然不同,就像一对既相似又有着鲜明个性的兄弟。咱们今天就来好好聊聊这两位“孪生兄弟”,看看它们到底有哪些相同点和不同点,是.............
  • 回答
    在训练你的分类模型时,你会经常听到“训练集”和“验证集”这两个词。它们听起来很像,但扮演的角色却截然不同,而且理解它们的区别对于构建一个真正好用的模型至关重要。想象一下,你要训练一个小孩识别各种水果。训练集:你的“教科书”和“练习册”训练集就像是给孩子的那本图文并茂的水果图鉴,里面有各种水果的照片,.............

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有