• LeetCode1154.一年中的第几天


    LeetCode-1154.一年中的第几天

      题目链接(微信打开):https://mp.weixin.qq.com/s/UeElxI9HLZyBH_VFC9bqtQ

    一、题目描述(我精简过)

      给你一个字符串格式为:YYMM-MM-DD,返回该日期是当年的第几天。

      样例:,

      2019-01-09,是2019年的第9天;

           2019-02-10,是2019年的第41天;

     

    二、题目分析

      这道题没啥难度,只能说看到它是一种缘分,所以我就做了。。。

      基础题的枚举即可,当然也可以用前缀和。大致讲下思路两者思路~

      从大框架来说,首先第一件事肯定是判断给出的年份是闰年还是平年,闰年366,平年365,闰年2月份有29天,平年是28天。闰年的判断方法是:是400的倍数或者是4的倍数且不是100的倍数,转化为算术表达式就是:

    year % 400 = 0 
    或者 year
    % 4 = 0 && year % 100 != 0

    1、枚举的思路:

      定义一个数组:m[1], m[2], ..., m[11], m[12],分别保存每月的天数

    ## 闰年
    m[1]=31, m[2]=29, m[3]=31, m[4]=30, m[5]=31, m[6]=30, m[7]=31, m[8]=31, m[9]=30, m[10]=31, m[11]=30, m[12]=31
    
    ## 平年
    设置都跟闰年的值一样,除了:m[2]=28

      假如给出:YYMM-MM-DD,我们先判断YYMM是平年还是闰年,然后设置结果变量:ans=0,统计 1 ~ MM-1的和,最后加上DD就是答案。

    for (i=1; i < MM; i++)
        ans += m[i]
    ans += DD
    print(ans)

    2、前缀和思路:

      定义一个数组:s[1], s[2], ..., s[11], s[12],表示到 i 这个月份总共的天数,例如s[3]表示1~3月份的总天数,s[11]就是1~12月份的总天数。表达式变成这样

    ans = s[MM-1] + DD
    print(ans)

      前缀和相对直接枚举的优点是,不用每个样例都要重新算一遍,例如给了:2022-03-12, 2010-05-12, xxxxx,如果样例有n个,且都是12月,那时间复杂度最差的时候是O(n*12),但前缀和是O(n)。 (算错了告诉我)。

      其实也没优化多少,乘多个常数忽略不计咯,不过告诉大家发散点思考问题还是好滴~~~

  • 相关阅读:
    2019-7-29-WPF-元素裁剪-Clip-属性
    2018-2-13-C#-枚举转字符串
    2018-2-13-C#-枚举转字符串
    2018-2-13-WPF-DelegateCommand-出现Specified-cast-is-not-valid
    什么是可串行化MVCC
    年轻就该多尝试,教你20小时Get一项新技能
    初识一周Linux(Ubuntu)我学会了什么
    Red Hat Linux的ftp安装和配置方法
    copy_{to, from}_user()的思考
    自定义注解!绝对是程序员装逼的利器!!
  • 原文地址:https://www.cnblogs.com/windysai/p/15998872.html
Copyright © 2020-2023  润新知