方法一 循环模拟
每七天为一个节点,从周一到周日每天比前一天+1,到了下一个周一,比上一个周一+1,再继续从周一到周日每天+1
var totalMoney = function(n) {
let Monday= 1,now=1,sum=1
for(let i=2;i<=n;i++){
now+=1
sum+=now
if(i%7==0){
Monday+=1
now=Monday-1
}
}
return sum
};
消耗时间和内存情况:
方法二 等差数列求和优化(leetcode官方题解)
因为每周七天存的钱之和比上一周多 777 块,因此每周存的钱之和的序列是一个等差数列,我们可以用等差数列求和公式来求出所有完整的周存的钱总和。剩下的天数里,每天存的钱也是一个等差数列,可以用相同的公式进行求和。最后把两者相加可以得到答案。
var totalMoney = function(n) {
// 所有完整的周存的钱
const weekNumber = Math.floor(n / 7);
const firstWeekMoney = Math.floor((1 + 7) * 7 / 2);
const lastWeekMoney = firstWeekMoney + 7 * (weekNumber - 1);
const weekMoney = Math.floor((firstWeekMoney + lastWeekMoney) * weekNumber / 2);
// 剩下的不能构成一个完整的周的天数里存的钱
const dayNumber = n % 7;
const firstDayMoney = 1 + weekNumber;
const lastDayMoney = firstDayMoney + dayNumber - 1;
const dayMoney = Math.floor((firstDayMoney + lastDayMoney) * dayNumber / 2);
return weekMoney + dayMoney;
};
消耗时间和内存情况: