这是我参与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;
}
}