诸神缄默不语-个人CSDN博文目录
力扣刷题笔记
文章目录
- 1. 简单粗暴的遍历
- 2. 其实也是遍历,但是用Python内置函数只用写一行
1. 简单粗暴的遍历
Python版:
class Solution:
def subtractProductAndSum(self, n: int) -> int:
he=0
ji=1
while n>=1:
last_number=n%10
he+=last_number
ji*=last_number
n=n//10 #就是n=int(n/10)的意思
return ji-he
Java版:
class Solution {
public int subtractProductAndSum(int n) {
int he=0;
int ji=1;
while(n>=1){
int last_number=n%10;
he+=last_number;
ji*=last_number;
n/=10; //我一开始写成了n=(int)(n/10); Java的话不需要做这个转换
}
return ji-he;
}
}
时间复杂度:
O
(
log
n
)
O(\log n)
O(logn)
空间复杂度:
O
(
1
)
O(1)
O(1)
参考ChatGPT的回答,解释一下时间复杂度:
这个函数的目的是计算给定数字 n n n 的各个数字的乘积与和的差值。在这个过程中,你会遍历整个数字的每一位。
时间复杂度是 O ( log n ) O(\log n) O(logn) 的原因是你每次迭代都会通过 n = n / / 10 n = n // 10 n=n//10 将数字的位数减少一位。因此,你将执行与数字 n n n 的位数相同的迭代次数。
现在,让我们理解为什么数字 n n n 最多有 log n \log n logn 位。
给定一个 k k k 位的数字 n n n,最大值为 1 0 k − 1 10^k-1 10k−1,最小值为 1 0 k − 1 10^{k-1} 10k−1:
1 0 k − 1 ≤ n < 1 0 k 10^{k-1} \leq n < 10^k 10k−1≤n<10k
取两边的对数,你得到:
k − 1 ≤ log 10 n < k k-1 \leq \log_{10} n < k k−1≤log10n<k
所以
k
k
k就是数字
n
n
n 的位数,它的上界是
log
10
n
+
1
\log_{10} n+1
log10n+1。
因此,遍历数字
n
n
n 的每一位需要
O
(
log
n
)
O(\log n)
O(logn) 的时间。
2. 其实也是遍历,但是用Python内置函数只用写一行
class Solution:
def subtractProductAndSum(self, n: int) -> int:
return eval('*'.join(str(n))) - eval('+'.join(str(n)))