来源力扣题目

# 计算力扣银行的钱

# 题目描述:

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

# 解题思路:

1、因为 7 天是一个定值,所以存储到数值中

2、由于到第二个星期后的每天都比第一个星期多 1 所以可以那么可以得出每周的是 7、14、21

3、所以可以用等差数列首项为 7,差值为 7 则 7 * (week - 1) * week / 2

代码:

public static int totalMoney(int day) {
        int[] days = {1, 3, 6, 10, 15, 21, 28};
        int count = 0;
        if (day <= 7) {
            count = days[day - 1];
        } else {
            int week = day / 7;
            // 每周的基础数
            count = (days[6] * week);
            // 加上迭代每周多出来的数
            // 通项公式为:an=a1+(n-1)*d。首项 a1=1,公差 d=2。前 n 项和公式为:Sn=a1*n+[n*(n-1)*d]/2 或 Sn=[n*(a1+an)]/2
            count = count + week * (week - 1)  * 7 / 2;
            // 如果不是完整的周数
            int lastWeek = day % 7;
            if (lastWeek != 0) {
                // 添加不满一周的数
                count = count + days[lastWeek - 1] + (week * lastWeek);
            }
        }
        return count;
    }
更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

Tz 微信支付

微信支付

Tz 支付宝

支付宝