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+1∗7)+(28+(2∗7)...+(28+((a−1)∗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=28∗a+7∗(1+2+...+(a−1))+((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=28∗a+7∗(a+(a−1))/2+(1+b)∗b/2+b∗a
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;
}
}