一起刷力扣之【1716. 计算力扣银行的钱】

181 阅读2分钟

这是我参与2022首次更文挑战的第12天,活动详情查看:2022首次更文挑战

题目

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

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

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

示例

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

解题思路

模拟

我们可以使用模拟来统计处每一天产生的金额,将其累加即可得出最终结果。

  • 定义base变量,用来记录每个周一的起始金额
  • 定义count变量,用来记录经历过的周的数量
  • 定义price变量,用来记录本周内每天增长的金额
  • 最后,使用result变量累加结果并返回
class Solution {
    public int totalMoney(int n) {
        int base = 0, count = 0, price = base, result = 0;
        while(n-- > 0){
            if(count++ % 7 == 0){
                ++base;
                price = base;
            }else{
                ++price;
            }
            result += price;
        }

        return result;
    }
}

数学

使用模拟我们需要遍历一遍n,累加每一天的结果,效率比较低。由于每一周都比上一周多出7元,因此我们可以将其理解为是一个等差数列,那么我们就可以采用等差数列的计算方式来算出最终结果。

class Solution {
    public int totalMoney(int n) {
        // 计算完整的周数
        int weekNumber = n / 7;
        // 计算第一周的总金额
        int firstWeek = (1 + 7) * 7 / 2;
        // 计算最后一个完整周的总金额
        int lastWeek = firstWeek + 7 * (weekNumber - 1);
        // 利用等差数列求的所有完整周数的总金额
        int weekMoney = (firstWeek + lastWeek) * weekNumber / 2;
        
        // 求的剩余天数
        int dayNumber = n % 7;
        // 剩余天数的起始金额
        int firstDay = 1 + weekNumber;
        // 最后一天的金额
        int lastDay = firstDay + dayNumber - 1;
        // 得出剩余天数总金额
        int dayMoney = (firstDay + lastDay) * dayNumber / 2;
        
        // 将完整周数的总金额加上剩余天数的总金额
        return weekMoney + dayMoney;
    }
}