程序员的算法趣题Q07: 日期的二进制转换
目录
1. 问题描述
2. 解题分析
3. 代码及测试
4. 优化
1. 问题描述
把年月日表示为YYYYMMDD这样的8位整数,然后把这个整数转换成二进制数并逆序排列,再把得到的二进制数转换成十进制数,求与原日期一致的日期。求得的日期要在上一次东京奥运会(1964-10-10)到下一次东京奥运会(2020-07-24)之间。
2. 解题分析
其实,就是找转换为二进制数后构成了回文数(关于回文数参见<<程序员的算法趣题Q01: 回文十进制数>>)的日期。
本题的焦点之一是关于日期的处理,纯粹人工处理的话需要考虑月份大小、闰年以及二月份这种特殊月份等情况,非常容易出错。好在各种编程语言都有内置的库来做这件事情。Python中由datetime模块来处理,所以问题变成了datetime模块的使用的问题。特别是日期递增的处理方式。
焦点之二是字符串的处理。
在以下代码中,有以下几个细节值得注意(不一定是最优的,只是本渣采用了这样比较笨拙的办法而已^-^):
- 由date变成string后中间会有分隔符“-”(没有找到不包含“-”的字符串变换方式),需要去除。这里用str.replace()处理
- 十进制数变成二进制数时输出的字符串,头上以“0b”开始,这个在进行是否回文数的判断中需要先去掉
- 回文数的判断,这个采用和Q01相同的处理方式,用str[:,:,-1]的方式取字符串逆序再与原字符串比较
3. 代码及测试
# -*- coding: utf-8 -*-
"""
Created on Thu Aug 26 08:35:55 2021@author: chenxy
"""
import sys
import time
import datetime
# import random
from typing import List
# from queue import Queue
# from collections import dequeclass Solution:def dateConversion(self, startDate: str, endDate: str) -> List:""":startDate: The state date in string format :endtDate: The end date in string format :ret: The list of dates in string format satisfying condition""" ans = []# Iteration up to endDate, by increment 1 per iterationdate = startDatewhile 1:# print(date)# Date --> string formatdateStr = str(date)# Remove '-' in the string format, for example, '1966-07-23'-->'19660723'dateStr1 = dateStr.replace('-','',-1)# Conver to integer and then to bin dateBin = bin(int(dateStr1))[2:]if dateBin == dateBin[::-1]:ans.append((date))if date == endDate:breakdate += datetime.timedelta(days=1) return ans
if __name__ == '__main__': sln = Solution() tStart = time.time()start = datetime.date(1964,10,10)end = datetime.date(2020,7,24)ans = sln.dateConversion(start,end)tCost = time.time() - tStartprint('start={0}, end={1}, tCost = {2}(sec)'.format(start,end,tCost)) for k in range(len(ans)):print('date = {0}: {1}'.format(k,ans[k]))
运行结果:
start=1964-10-10, end=2020-07-24, tCost = 0.030805349349975586(sec)
date = 0: 1966-07-13
date = 1: 1966-09-05
date = 2: 1977-02-17
date = 3: 1995-06-17
date = 4: 2002-05-05
date = 5: 2013-02-01
4. 优化
原书中提示了可以利用构成回文数的日期的特性可以大幅度削减搜索范围。当然其代价就是解决方案的可读性以及可扩展性。
To be discussed.
上一题:Q06: 改版考拉兹猜想
下一题:Q08: 优秀的扫地机器人
本系列总目录:程序员的算法趣题:详细分析和Python全解
程序员的算法趣题Q07: 日期的二进制转换相关推荐
- php算法求出一个数可以被分解成多少个_程序员的算法趣题
计算机的世界每天都在发生着深刻的变化.新操作系统的发布.CPU性能的提升.智能手机和平板电脑的流行.存储介质的变化.云的普及--这样的变化数不胜数. 在这样日新月异的时代中,"算法" ...
- LeetBook《程序员的算法趣题》Q18---水果酥饼日
<程序员的算法趣题>-(日)增井敏克 , 书中为69 道数学谜题编写了解题程序, 编程语言为:Ruby,JavaScript,C语言. Q18 水果酥饼日 日本每月的 22 日是水果酥 ...
- 程序员的算法趣题Q50: 完美洗牌
目录 1. 问题描述 2. 解题分析 2.1 思路1 2.2 思路2 3. 代码及测试 4. 后记 1. 问题描述 问题:对2n张牌洗牌,并求当1<=n<=100时,一共有多少个n可以使得 ...
- 程序员的算法趣题Q09: 落单的男女
目录 1. 问题描述 2. 解题分析 3. 代码及测试 4. 思考 1. 问题描述 人们聚集在某个活动会场上,根据到场顺序排成一排等待入场,活动的主办人员,想把人们从队列的某个位置分成两组,想要让分开 ...
- 程序员的算法趣题Q55: 平分蛋糕
目录 1. 问题描述 2. 解题分析 2.1 初始算法流程 2.2 优化 3. 代码及测试 4. 后记 1. 问题描述 2. 解题分析 这个题目第一感就是动态规划. 对于(m, n)形状(如下图所示, ...
- 程序员的算法趣题Q67: 不挨着坐是一种礼节吗?
目录 1. 问题描述 2. 解题分析 2.1 基本思路 2.2 动态规划 2.3 算法流程 3. 代码及测试 4. 后记 1. 问题描述 注意,本问题不区分人,只考虑各个座位被占用的不同顺序的个数. ...
- 程序员的算法趣题Q68: 异性相邻的座位安排(1)
目录 1. 问题描述 2. 解题分析 3. 代码及测试 4. 后记 1. 问题描述 这道题的描述应该是有问题的(不知道是原文的问题还是翻译的问题). 前面的描述中提到"前后左右的座位全是异性 ...
- 程序员的算法趣题Q57: 最快的联络网
目录 1. 问题描述 2. 解题分析 2.1 学生的状态 2.2 学生状态转移 Case-T1:Do nothing, just wait Case-T2:给处于S0状态的学生打电话 Case-T3: ...
- 程序员的算法趣题:Q13 有多少种满足字母算式的解法(Java版)
题目说明 所谓字母算式,就是用字母表示的算式, 规则是相同字母对应相同数字,不同字母对应不同数字, 并且第一位字母的对应数字不能是 0. 譬如给定算式 We * love = CodeIQ,则可以对应 ...
最新文章
- log nginx 客户端请求大小_后端实践:Nginx日志配置(超详细)
- 1039: 二哥的困惑 Ⅱ
- Eclipse输入Java和XML代码自动提示功能最简单的方法
- websocket阮一峰博客地址教学
- python画彩色螺旋线_Python turtle 绘制彩色螺旋线
- access计算机二级改工号,Access新手来看:如何更改表/窗体/报表...得名字
- 从华为“流程与IT管理部”看IT部门定位
- java生命游戏并行_Java架构--线程的发展历史
- proteus微型计算机梯形波,接口芯片dac0832的应用 三角波、梯形波两种波形.doc
- 注册表的保存位置在哪里?注册表文件保存在哪里?
- Android系统架构及生态链
- 从程序员到项目经理(8):程序员加油站 -- 不要死于直率
- CSDN大神多,在这里驻扎一下,沾沾神气
- 内网渗透---ms14068
- Long型 时间戳转换 得到格林时间 格式:2020-02-25T16:00:00.00Z
- DophinScheduler ui部分 核心代码详细解析——重中之重的src文件夹里究竟有何种玄机
- 微信官方小店小程序老徐解析
- mac报错: vue-cli-service: command not found
- (JVM)双亲委派机制 破坏双亲委派机制
- 帝国cms网站迁移到新的服务器,最简单的帝国CMS网站转移方法详解
热门文章
- 技术分享 | 从自动微分到可微编程语言设计(三)
- “数据湖存储”冠军杯足球赛开幕,腾讯云存储出征!
- hadoop ----5 MR
- 3D格式转换工具HOOPS Exchange最全技术指南(四):4大功能特征与典型使用场景
- 中科院科研人员自白:我为什么离开北京
- FTP主动模式和被动模式的区别(转) 以及 Linux vsftp 相关配置
- 奇迹MU开服教程篇-单机版
- 将Rmarkdown 转为html或pdf
- steam++下载(最新,2023年)
- 【第一周】吴恩达团队AI for Medical Diagnosis课程笔记