每周一道算法题009:找二进制对称的日期
发布时间:2020-12-13 21:32:17 所属栏目:PHP教程 来源:网络整理
导读:题目: 把年月日表示为YYYYMMDD这样的8位整数,然后把这个整数转换成二进制数并且逆序排列,再把得到的二进制数转换成十进制数,求与原日期一致的日期。求得的日期要在上一次东京奥运会(1964年10月10日)到下一次东京奥运会(预定举办日期为2020年7月24日)
题目:
把年月日表示为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,time.Local) t2 := time.Date(2020,7,24,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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |