算法每日一题:一周中的第几天 | 日历类题目

大家好,我是星恒,已经连续5天没有发每日一题了,其实我每天都有写帖子的草稿,但是这几天学校考试,总是着急的写完就去看专业课了,一直没机会发出来,所以趁着这几天元旦休息,就一下将前面几天的每日一题发出来啦!

今天的每日一题又是简单题,难道快过元旦了,leetcode官方要给咱们力扣人放假了吗,哈哈😄

这次的题目是有关年月日的,如果大家没做过这类型的题,这道题还是值得一看的;好,话不多说,我们直接开始!

题目:leetcode 1185

给你一个整数数组 prices ,它表示一个商店里若干巧克力的价格。同时给你一个整数 money ,表示你一开始拥有的钱数。

你必须购买 **恰好 **两块巧克力,而且剩余的钱数必须是 非负数 。同时你想最小化购买两块巧克力的总花费。

请你返回在购买两块巧克力后,最多能剩下多少钱。如果购买任意两块巧克力都超过了你拥有的钱,请你返回 money 。注意剩余钱数必须是非负数。

示例:
示例 1:

复制代码
输入:prices = [1,2,2], money = 3
输出:0
解释:分别购买价格为 1 和 2 的巧克力。你剩下 3 - 3 = 0 块钱。所以我们返回 0 。

示例 2:

复制代码
输入:prices = [3,2,3], money = 3
输出:3
解释:购买任意 2 块巧克力都会超过你拥有的钱数,所以我们返回 3 。

提示:

  • 2 <= prices.length <= 50
  • 1 <= prices[i] <= 100
  • 1 <= money <= 100

分析:

思路就是算出现在到1971年有多少天,然后和7取余(当然,这里是将总天数为1971的附近几天的周一再取余),这样就做出来啦

具体思路就是 :

  1. 先算当前年之前的年份天数
  2. 再算当前月份之前月份的天数
  3. 最后加上本月份的天数

这道题目本身很简单,不过需要注意以下几个点(也是做日历题的经验):

  • 会使用数组来记录周和月份天数
  • 敢通过日历经验来做题(比如年的天数,1971 - 2100之间没有特殊的情况:是4的倍数但不是闰年)
  • 本年闰年的判断(主要是要将本年给单拎出来,因为他的月份可能不包含2)

题解:

java 复制代码
class Solution {
    public String dayOfTheWeek(int day, int month, int year) {
        String[] week = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"};
        int[] monthDays = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30};
        /* 输入年份之前的年份的天数贡献 */
        int days = 365 * (year - 1971) + (year - 1969) / 4;
        /* 输入年份中,输入月份之前的月份的天数贡献 */
        for (int i = 0; i < month - 1; ++i) {
            days += monthDays[i];
        }
        if ((year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) && month >= 3) {
            days += 1;
        }
        /* 输入月份中的天数贡献 */
        days += day;
        return week[(days + 3) % 7];
    }
}

如果大家有什么思考和问题,可以在评论区讨论,也可以私信我,很乐意为大家效劳。

好啦,今天的每日一题到这里就结束了,如果大家觉得有用,可以可以给我一个小小的赞呢,我们下期再见!

相关推荐
薪火铺子几秒前
Redis 分布式锁与 Redisson 原理深度解析
java·redis·分布式·后端
胡楚昊2 分钟前
BUU WEB之旅(1)
java·数据库·mybatis
Cando学算法3 分钟前
欧拉回路(一笔画)
数据结构·c++·图论
嵌入式小企鹅11 分钟前
大模型算法工程师面试宝典
人工智能·学习·算法·面试·职场和发展·大模型·面经
牢七14 分钟前
链条合集整理
java·开发语言
我不是懒洋洋15 分钟前
手写一个并查集:从原理到最小生成树实战
c语言·c++·经验分享·算法
图码21 分钟前
一文搞懂如何判断字符串是否为Pangram(全字母句)
数据结构·算法·网络安全·数字雕刻·ping++
小雅痞27 分钟前
[Java][Leetcode hard] 30. 串联所有单词的子串
java·leetcode
khalil102037 分钟前
代码随想录算法训练营Day-43 动态规划10 | 300.最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组
数据结构·c++·算法·leetcode·动态规划·子序列问题
钝挫力PROGRAMER1 小时前
static final 指向可变集合的设计模式
java·设计模式