首页 / 算法 / 每周一道算法题009:找二进制对称的日期
每周一道算法题009:找二进制对称的日期
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了每周一道算法题009:找二进制对称的日期,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1645字,纯文字阅读大概需要3分钟。
内容图文
![每周一道算法题009:找二进制对称的日期](/upload/InfoBanner/zyjiaocheng/737/2a205998988e4a709587da8602afb1de.jpg)
题目:
把年月日表示为YYYYMMDD这样的8位整数,然后把这个整数转换成二进制数并且逆序排列,再把得到的二进制数转换成十进制数,求与原日期一致的日期。求得的日期要在上一次东京奥运会(1964年10月10日)到下一次东京奥运会(预定举办日期为2020年7月24日)之间。
思路:
从起始时间开始逐天累加,对每一天进行进制转换并反转,然后比较,如果相同就输出,不同就继续,直至到达结束时间。
解答:
php:
function findDate($begin, $end)
{
$beginDate = new DateTime($begin);
$endDate = new DateTime($end);
while ($beginDate != $endDate) {
$dateNum = $beginDate->format("Ymd");
$binStr = decbin($dateNum);
$revStr = strrev($binStr);
if ($revStr == $binStr) {
echo $dateNum . "\n";
}
$beginDate = $beginDate->add(new DateInterval('P1D'));
}
}
findDate("1964-10-10", "2020-07-24");
输出:
19660713
19660905
19770217
19950617
20020505
20130201
golang:
package main
import (
"fmt"
"strconv"
"time"
)
func main() {
t1 := time.Date(1964, 10, 10, 0, 0, 0, 0, time.Local)
t2 := time.Date(2020, 7, 24, 0, 0, 0, 0, time.Local)
findDate(t1, t2)
}
func findDate(begin, end time.Time) {
for begin != end {
// 将日期格式化为字符串
dateNum := begin.Format("20060102")
// 字符串转为数字
dateInt, _ := strconv.Atoi(dateNum)
// 转为二进制
dateBin := strconv.FormatInt(int64(dateInt), 2)
revBin := Reverse(dateBin) // 反转二进制字符串
if revBin == dateBin {
fmt.Println(dateNum)
}
// 日期累加
dd, _ := time.ParseDuration(fmt.Sprintf("%dh", 24))
begin = begin.Add(dd)
}
}
// 反转字符串
func Reverse(s string) string {
runes := []rune(s)
for from, to := 0, len(runes)-1; from < to; from, to = from+1, to-1 {
runes[from], runes[to] = runes[to], runes[from]
}
return string(runes)
}
输出:
19660713
19660905
19770217
19950617
20020505
20130201
内容总结
以上是互联网集市为您收集整理的每周一道算法题009:找二进制对称的日期全部内容,希望文章能够帮你解决每周一道算法题009:找二进制对称的日期所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。