leetcode每日一题--1716. 计算力扣银行的钱

1716. 计算力扣银行的钱

题目描述

Hercy 想要为购买第一辆车存钱。他 每天 都往力扣银行里存钱。

最开始,他在周一的时候存入 1 块钱。从周二到周日,他每天都比前一天多存入 1 块钱。在接下来每一个周一,他都会比 前一个周一 多存入 1 块钱。

给你 n ,请你返回在第 n 天结束的时候他在力扣银行总共存了多少块钱。

示例 1

输入:n = 4
输出:10
解释:第 4 天后,总额为 1 + 2 + 3 + 4 = 10 。

示例 2

输入:n = 10
输出:37
解释:第 10 天后,总额为 (1 + 2 + 3 + 4 + 5 + 6 + 7) + (2 + 3 + 4) = 37 。注意到第二个星期一,Hercy 存入 2 块钱。

示例 3

输入:n = 20
输出:96
解释:第 20 天后,总额为 (1 + 2 + 3 + 4 + 5 + 6 + 7) + (2 + 3 + 4 + 5 + 6 + 7 + 8) + (3 + 4 + 5 + 6 + 7 + 8) = 96 。

提示

1 <= n <= 1000

解题思路

理解题目并不难,可以将存入的钱视作一个二维矩阵,暴力解法循环遍历求和即可;也可以直接使用等差数列来求解,这样时间复杂度和空间复杂度都优于暴力解法。

等差数列公式:
a n = a 1 + d ∗ ( n − 1 ) a_n = a_1 + d*(n - 1) an=a1+d(n1)

S n = ( a 1 + a n ) ∗ n 2 S_n = \frac{(a_1 + a_n) * n}{2} Sn=2(a1+an)n

之后的代码只需要使用这两个公式。

代码

JavaScript

/**
 * @param {number} n
 * @return {number}
 */
var totalMoney = function(n) {
    // 完整周数
    let weekAmount = parseInt(n / 7);
    // 最后一周的天数
    let dayAmount = n % 7;
    // 第一周存入的钱
    let firstWeekMoney = (1 + 7) * 7 / 2;
    // 最后一个完整周存入的钱
    let lastWeekMoney = firstWeekMoney + 7 * (weekAmount - 1);
    // 完整周存入钱的总数
    let weekMoney = (firstWeekMoney + lastWeekMoney) * weekAmount / 2;
    // 最后一周的第一天存入的钱
    let firstDayMoney = weekAmount + 1;
    // 最后一周的最后一天存入的钱
    let lastDayMoney = weekAmount + dayAmount;
    // 最后一周存入钱的总数
    let dayMoney = (firstDayMoney + lastDayMoney) * dayAmount / 2;
    return weekMoney + dayMoney;
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

真的该去学习了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值