刨根究底才能记忆深刻。
LintCode算法题:给定一个整数 n
,计算出n!
中尾部零的个数。
你算法的时间复杂度应为 O(logn)。
给出的标准答案之一为:
public long trailingZeros(long n) {
long ans = 0;
while (n != 0) {
n /= 5;
ans += n;
}
return ans;
}
简单的说就是尾部是0,那就是得到10,10的因子是2跟5,很明显因子2的个数肯定大于5。
因为是求尾部的0所以就找因子5的个数就行。
直接用n 去除5求商。
顺带了解一下时间和空间复杂度的概念。
时间复杂度:算法耗费的时间。
空间复杂度:算法耗费的内存空间。
1、O(n) ,线性阶,数据量增加n倍,耗时增加n倍。
比如for循环遍历。
2、O(n^2) , 平方阶,数据量增加n倍,耗时增加n的平方倍。
比如冒牌排序,双层循环嘛。
3、O(logn) ,对数阶,数据量增加n倍,耗时增加logn倍,其中log以2为底,也就是说n为256时,耗时增加logn 也就是8倍。
比如二分查找,每次排除一半嘛。
4、O(nlogn) , 线性对数阶,数据量增加n倍,耗时增加n*logn倍。
比如归并排序,可以理解为二分查找加上正常排序。
5、O(1) , 常数阶,无论数据增加多少倍,一次计算就能找到。
比如哈希算法。