模拟 -leetcode-1716. 计算力扣银行的钱

1716. 计算力扣银行的钱

题目描述

Hercy 想要为购买第一辆车存钱。他 每天 都往力扣银行里存钱。
最开始,他在周一的时候存入 1 块钱。从周二到周日,他每天都比前一天多存入 1 块钱。在接下来每一个周一,他都会比 前一个周一 多存入 1 块钱。
给你 n ,请你返回在第 n 天结束的时候他在力扣银行总共存了多少块钱。

提示:

  • 1 < = n < = 1000 1 <= n <= 1000 1<=n<=1000

模拟

朴素模拟

class Solution {
    public int totalMoney(int n) {
        int res = 0;
        int begin = 0;
        for (int i = 1; i <= n; i += 7) {
            for (int j = i; j <= n && j < i + 7; j++) {
                res = res + begin + ((j % 7 == 0) ? 7 : (j % 7));
            }
            begin++;
        }
        return res;
    }
}

模拟2

思路:

  • 先算前所有“满周”的存钱;
  • 再算最后一周不满周的所有天数
class Solution {
    public int totalMoney(int n) {
        int a = n / 7; // 周数
        int b = n % 7; // 最后不满一周
        int begin = 1;
        int res = 0;
        while (a-- > 0) { // 计算“满周”所有存钱
            res += (begin + begin + 6) * 7 / 2;
            begin++; // 下周一多存一块钱
        }
        // 不满周每天单算
        while (b-- > 0) {
            res += (begin++);
        }
        return res;
    }
}

数学

每周内为等差数列,每周间也为等差数列.

分为两个部分:满周计算 + 最后一周不满周天数

  • r e s = 28 + ( 28 + 1 ∗ 7 ) + ( 28 + ( 2 ∗ 7 ) . . . + ( 28 + ( ( a − 1 ) ∗ 7 ) + ( ( a + 1 ) + ( a + 2 ) + . . . + ( a + b ) ) res=28+(28 + 1*7)+(28 + (2*7)...+(28 + ((a-1)*7)+((a+1)+(a+2)+...+(a+b)) res=28+(28+17)+(28+(27)...+(28+((a1)7)+((a+1)+(a+2)+...+(a+b))
  • r e s = 28 ∗ a + 7 ∗ ( 1 + 2 + . . . + ( a − 1 ) ) + ( ( a + 1 ) + ( a + 2 ) + . . . + ( a + b ) ) res=28*a + 7*(1+2+...+(a-1)) + ((a+1)+(a+2)+...+(a+b)) res=28a+7(1+2+...+(a1))+((a+1)+(a+2)+...+(a+b))
  • r e s = 28 ∗ a + 7 ∗ ( a + ( a − 1 ) ) / 2 + ( 1 + b ) ∗ b / 2 + b ∗ a res=28*a + 7*(a+(a-1))/2 + (1+b)*b/2 + b*a res=28a+7(a+(a1))/2+(1+b)b/2+ba
class Solution {
    public int totalMoney(int n) {
        // 不满一周
        if (n < 7) return (1 + n) * n / 2;
        int a = n / 7; // 周数
        int b = n % 7; // 最后不满一周的天数
        return 28 * a + 7 * a * (a - 1) / 2 
            + (b + 1) * b / 2 + b * a;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值