算法

来源:互联网 发布:绫致时装官方店淘宝 编辑:程序博客网 时间: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;}}
原创粉丝点击