题解 | #[NOIP2016]回文日期#

技巧:
    枚举 - 缩小规模
思路:
    将所有可能的月份和日排列组合然后翻转 看翻转后的值是否在给定的日期范围内。
实现:
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)
}


全部评论

相关推荐

敢逐云霄志:你打招呼语怎么能这么长,hr都没看下去的欲望,简明扼要说重点,就读于某某学校某某专业,26届应届毕业生,学信网可查,先后在某某公司实习过(如有),然后做过什么项目,想找一份什么样的工作,可实习几个月以上,期待您的回复。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务