leetcode
leetcode 1501 ~ 1550
计算力扣银行的钱

计算力扣银行的钱

难度:

标签:

题目描述

代码结果

运行时间: 20 ms, 内存: 15.9 MB


/*
 * Solution in Java using Streams
 * The problem requires calculating the total amount saved in the bank after n days.
 * The amount saved follows a pattern where each day of the week the saving increases by 1 starting from 1 on Monday.
 * Each subsequent Monday the starting amount increases by 1.
 * For example, if n = 10, the savings would be 1, 2, 3, 4, 5, 6, 7, 2, 3, 4.
 */

import java.util.stream.IntStream;

public class SavingsCalculatorStream {
    public int totalSavings(int n) {
        return IntStream.rangeClosed(1, n)
                        .map(i -> ((i - 1) / 7) + 1 + ((i - 1) % 7))
                        .sum();
    }
    
    public static void main(String[] args) {
        SavingsCalculatorStream scs = new SavingsCalculatorStream();
        System.out.println(scs.totalSavings(4));  // Output: 10
        System.out.println(scs.totalSavings(10)); // Output: 37
        System.out.println(scs.totalSavings(20)); // Output: 96
    }
}

解释

方法:

题解首先通过整除和取余操作将天数分解为完整的周数和剩余的天数。对于每一完整的周,采用循环来计算每周存款的总额,每周的存款起始金额比上一周多1块钱。计算完所有完整的周之后,再计算剩余天数的存款总额。通过累加每周的存款和剩余天数的存款得到最终的总金额。

时间复杂度:

O(n)

空间复杂度:

O(1)

代码细节讲解

🦆
在算法中,为什么选择使用循环来处理每周的存款,是否有其他更高效的数学公式可以直接计算出每周的总存款?
使用循环处理每周的存款是因为每周的起始存款金额递增,不是一个固定值。虽然可以通过数学公式直接计算每周的存款总额(即等差数列求和公式),每周的存款总额可以表达为 `28 + 7*(base-1)`,其中 `base` 是该周的起始存款金额。但是,计算多周的总存款仍然需要一种方式来累加每周的结果,即便这可以通过更复杂的数学公式(如求和公式的嵌套应用)完成,实现可能不如直接使用循环直观或易于理解。
🦆
在计算剩余天数存款时,你是如何确定`base`变量的值的?请解释这个值是如何计算得出的。
`base`变量代表每周开始的第一天的存款金额。其值在每周增加1,因此在计算完所有完整周后,`base`的值为初始值1加上完整周数`weeks`。例如,如果有3周,则在计算剩余天数的存款时,`base`将开始于4。
🦆
代码中使用了`range(base, base + 7)`和`range(base, base + days)`,请问这种使用范围函数的方式是否考虑了所有边界情况?例如,当剩余天数为0时,这段代码的行为是什么?
是的,这种使用方式已经考虑了所有边界情况。`range(base, base + days)`在`days`为0时,结果是一个空范围,因此`sum(range(base, base + days))`将返回0,这意味着没有额外的存款金额被添加,适用于剩余天数为0的情况。
🦆
在整个解决方案中,是否考虑了`n`为非常小(例如n=1)或非常大(例如n=10000)的情况?这会对算法的效率产生什么影响?
解决方案适用于从非常小到非常大的`n`值。对于小值,如`n=1`,算法迅速通过直接计算少量数据解决问题。对于大值,如`n=10000`,虽然算法仍有效,但其效率主要受限于循环的使用,因为必须对每一周进行迭代和计算。虽然这种方法的时间复杂度是线性的,对于非常大的输入,执行时间会随之增长,但在实际应用中通常是可接受的。

相关问题