学算法1

57 阅读2分钟

给你两个正整数 n 和 m 。

现定义两个整数 num1 和 num2 ,如下所示:

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

返回整数 num1 - num2 。

第一时间想到 class Solution { func differenceOfSums(_ n: Int, _ m: Int) -> Int { var sum1 = 0 var sum2 = 0 for i in 0...n{ if(i < m){ sum1+=i }else{ if(i%m == 0){ sum2+=i }else{ sum1+=i}}} return sum1-sum2}}

截屏2023-10-12 10.48.23.png 通过了,内存和时间都不对

两个sum能不能干掉一个sum, class Solution { func differenceOfSums(_ n: Int, _ m: Int) -> Int { var sum1 = 0 for i in 0...n{ if(i < m){ sum1+=i }else{ if(i%m == 0){ sum1-=i }else{ sum1+=i}}} return sum1 } }

截屏2023-10-12 10.52.43.png 立刻去掉一个sum 内存立马干掉100%用户,运行时间还是不对,时间复杂度是n,说明这道题不能遍历解决,改了一下循环,显著降低循环量没效果,内存问题又回来了,全靠电脑速度快。

class Solution { func differenceOfSums(_ n: Int, _ m: Int) -> Int { var sum1 = 0 if n >= m{ sum1 = (n+1)n/2 for i in 1...n/m{ sum1 = sum1 - im - i*m}}else{ sum1 = (n+1)*n/2 } return sum1 } } 截屏2023-10-12 11.19.38.png

另一个sum也不能要,怎么不要sum呢?下面直接return,慢慢发现上面i*m也是等差公式。也可以用等差公式直接return,遇到一个奇葩的问题

class Solution { func differenceOfSums(_ n: Int, _ m: Int) -> Int { if n >= m{ return (n+1)*n/2 - (m * (n/m) + m) * (n/m)/2 - (m * (n/m) + m) * (n/m)/2 }else{ return(n+1)*n/2 }}}

截屏2023-10-12 11.42.44.png

服了,还是不行。没循环啊!仔细看一看,n大于m还是n小于m都没啥区别,余了之后会变成0,去掉判断。 func differenceOfSums(_ n: Int, _ m: Int) -> Int { return (n+1)*n/2 - (m * (n/m) + m) * (n/m)/2 - (m * (n/m) + m) * (n/m)/2 }

结果这都不行,吗的,电脑问题吧。

截屏2023-10-12 11.48.47.png

连减两个可以去掉,结果还是不行。 class Solution { func differenceOfSums(_ n: Int, _ m: Int) -> Int { return (n+1)*n/2 - (m * (n/m) + m) * (n/m) }}

截屏2023-10-12 11.54.33.png

class Solution { func differenceOfSums(_ n: Int, _ m: Int) -> Int { return (n+1)*n/2 - m * ((n/m) + 1) * (n/m) }}

提取了一下公因式还是不行,改用谷歌浏览器不行,受不了了,绝对是电脑的问题。

截屏2023-10-12 13.40.08.png