每週一道算法題009:找二進制對稱的日期

題目:

把年月日表示爲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("24h")
        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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章