技巧:
枚举 - 缩小规模
思路:
将所有可能的月份和日排列组合然后翻转 看翻转后的值是否在给定的日期范围内。
实现:
package main import ( "fmt" "strconv" ) func main() { var begin, end string fmt.Scan(&begin, &end) // 开始年份 int beginYearInt, _ := strconv.Atoi(begin[:4]) // 结束年份 int endYearInt, _ := strconv.Atoi(end[:4]) // 每月有几天 monthDays := []int{-1, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} ans := 0 // 枚举月和日的组合 for i := 1; i <= 12; i++ { monthStr := "" if i < 10 { monthStr = "0" } monthStr = fmt.Sprintf("%s%d", monthStr, i) for j := 1; j <= monthDays[i]; j++ { dayStr := "" if j < 10 { dayStr = "0" } dayStr = fmt.Sprintf("%s%d", dayStr, j) // 将月和日字符串拼接然后回文 surffix := []byte(monthStr + dayStr) for k := 0; k < 2; k++ { surffix[k], surffix[3-k] = surffix[3-k], surffix[k] } //获取回文后的年份并判断是否在给定年份范围内 year, _ := strconv.Atoi(string(surffix)) if year >= beginYearInt && year <= endYearInt { // 排除闰年 if year%4 == 0 && year%100 != 0 && year%400 == 0 && i == 2 && j > 28 { continue } ans++ } } } fmt.Println(ans) }