leetcode每天一题:【计算力扣银行的钱】(简单)

307 阅读2分钟

这是我参与2022首次更文挑战的第3天,活动详情查看:2022首次更文挑战

题目描述

leetcode题目地址

有个小伙子想存钱,一周七天,周一存1块钱,第二天比第一天多一块钱,依次类推,直到周日;

第二周的第一天比第一周的第一天多一块,第二天比第一天多一块钱,依次类推,直到周日;

后面以此类推。

问:第n天后小伙子可以总共存多少钱

举个例子:

n = 4
输出 10 (1+2+3+4)

n = 10
输出 37 (1+2+3+4+5+6+7)+(2+3+4)

n = 16
输出 70 (1+2+3+4+5+6+7)+(2+3+4+5+6+7+8)+(3+4)

思路分析

我们可以从给的例子中找到规律

  • 第一周存够7天,则会存到28块(1+2+3+4+5+6+7)
  • 第二周存够7天,则会存到35块(2+3+4+5+6+7+8)
  • 第三周存够7天,则会存到42块(3+4+5+6+7+8+9)

每周都会比上周多7块,但是这种情况是取决于你存满了7天。

如果你存不满7天,就得把前面几天相加。

所以我们就得分2部分,存满7天和不满7天,二者相加就是最后的结果。

代码

我们可以把对天数n进行除以7求商取整,这个就是满7天的次数。

对天数n就进行除以7取余,这个就是不满7天的天数。

然后遍历满7天的次数,以28为基数(第一周的总和),每次都逐级加7,直到和满7天的次数相等,才停止。(这里我使用while遍历)

然后对于不满7天的天数,以满7天的次数为基数(因为每周的第一天都比上一周的第一天多一块,和满7天的次数相等),然后都逐级加1,直到等于不满7天的天数。(这里我使用while遍历)

把2次结果相加,就是需要返回的结果。

代码如下:

/**
 * @param {number} n
 * @return {number}
 */
var totalMoney = function (n) {
  let res = 0
  let i1 = 0
  let i2 = 0
  const n1 = parseInt(n / 7)
  const n2 = n % 7
  // 满7天的
  while (i1 < n1) {
    res += (28 + 7 * i1++)
  }
  // 不满7天的
  while (i2 < n2) {
    res += (++i2 + n1)
  }
  return res
};

大家如果还有别的做法欢迎评论交流。