算法
来源:互联网 发布:绫致时装官方店淘宝 编辑:程序博客网 时间:2024/06/06 03:54
题目
设计一个算法,计算出n阶乘中尾部零的个数
样例:
11!=39916800,因此返回是2
挑战:
O(logN)的时间复杂度
解题思路
将1*2*3*4*5…N中的每个因数进行分解质因数,10可以分解为2*5,因此只有质数2*5才能产生0,其余任意俩个质数相乘均不能产生0,且2*5只可以产生一个0,因此对阶乘中相乘的各数进行分解质因数,分解之后的式子有几对2*5就有几个0,又由于2的个数显然比5的个数多的额,因此只需要统计5的个数即可的额,
计算这一串数字中有几个5,即寻找5的倍数,从而得到几个5的
例如:
26/5+25/25=6
1000的阶乘:
1000/5+1000/25+1000/125+1000/625=249
1000/5+1000/5/5+1000/5/5/5+1000/5/5/5/5=249
代码实现
public class Solution{ public static void main(String[] args){ long n=26; System.out.println(trailingZeros(n));}//方法一public static long trailingZeros(long n){ long count=0; //count计数器的,统计出现几个0的 for(int i=1;Math.pow(5,i)<n;i++){ long x=(long)Math.pow(5,i); count+=n/x;} return count;} public static long tailingZeros(long n){ long count=0; //count计数器,统计出现几个0的 while(n!=0){ count=n/5+count; n=n/5; } return count; }}
题目描述
在数据结构中,哈希函数是用来将一个字符串(或者任何其他类型的)转化为小于哈希表大小且大于等于零的整数,一个好的哈希函数可以尽可能少地产生冲突,一种广泛使用的哈希函数算法是使用数值33,假设任何字符串都是基于33的一个大整数,比如
hashcode("abcd")=(ascii(a)*33^3+ascii(b)*33^2+ascii(c)*33+ascii(d))%HASH_SIZE =(97*33^3+98*33^2+99*33+100)%HASH_SIZE =3595978%HASH_SIZE其中的HASH_SIZE表示的是哈希表的大小的,可以假设一个哈希表就是一个索引0~HASH_SIZE-1的数组给出一个字符串作为key和一个哈希表的大小,返回这个字符串的哈希值样例:对于key="abcd" 并且size=100,返回78
思路解析
由于题目已经给出了哈希算法,因此根据题目中的算法进行分析
有以下几种情况,当分别输入不同字符串时候,hashcode值分别为:
a 97%HASH_SIZE
ab (97*33+98)%HASH_SIZE
abc (97*33^2+98*33+99)%HASH_SIZE
abcd (97*33^3+98*33^2+99*33+100)%HASH_SIZE
代码实现
public class Solution{ public static void main(String[] args){ String str="abcd"; char[] key=str.toCharArray(); System.out.println(hashCode(key,100));}public static int hashCode(char[] key,int HASH_SIZE){ long hashcode=0; for(int i=0;i<key.length;i++){ hashcode=(hashcode*33+(int)key[i])%HASH_SIZE; } return hashcode;}}