JavaScript算法43- 分类求和并作差(leetCode:100103easy)周赛

2894. 分类求和并作差

一、题目

给你两个正整数 nm

现定义两个整数 num1num2 ,如下所示:

  • num1:范围 [1, n] 内所有 无法被 m 整除 的整数之和。
  • num2:范围 [1, n] 内所有 能够被 m 整除 的整数之和。
    返回整数 num1 - num2

示例

输入:n = 10, m = 3
输出:19
解释:在这个示例中:
- 范围 [1, 10] 内无法被 3 整除的整数为 [1,2,4,5,7,8,10] ,num1 = 这些整数之和 = 37 。
- 范围 [1, 10] 内能够被 3 整除的整数为 [3,6,9] ,num2 = 这些整数之和 = 18 。
返回 37 - 18 = 19 作为答案。

提示:

  • 1 <= n, m <= 1000

二、题解

  • 思路:(求出范围[1,n]的整数和) - (求出[1,n]內能够被整除的整数和)*2
/**
 * @param {number} n
 * @param {number} m
 * @return {number}
 */
var differenceOfSums = function(n, m) {
    const sum1 = add(n);
    const sum2 = m * add(Math.floor(n/m)) 
    return sum1 - sum2*2;
};

var add = function(n){
    if(n==1 || n ==0){
        return n;
      }else{
        return add(n-1)+n;
      }
}

这里我写了一个函数,专门用来求1+2+…+n 的和

优化:使用等差数列求和的公式,免去新建一个函数,循环计算
在这里插入图片描述
和=(首项+末项)×项数÷2

➡️ 1+2+3+…+n = n*(n+1) / 2

优化后

var differenceOfSums = function(n, m) {
    let sum1 = n * (n + 1)/2;
    // 能够被 m 整除的项数
    const num = Math.floor(n/m);
    const sum2 = m * num * (num + 1) / 2;
    return sum1 - sum2 * 2;
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值