来源力扣题目
# 计算力扣银行的钱
# 题目描述:
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; | |
} |