day23_0520
选择题
我们首先必须要知道在建立这个散列表时,每个数据存储时进行了几次散列。这样就知道哪一个元素,查找的长度是多少。散列表的填表过程如下:首先存入第一个元素38,由于h(38)=38%7=3,又因为3号单元现在没有数据,所以把38存入3号单元。 接着存入第二个元素25,由于h(25)=25%7=4,又因为4号单元现在没有数据,所以把25存入4号单元。 接着存入第三个元素74,由于h(74)=74%7=4,此时的4号单元已经被25占据,所以进行线性再散列,线性再散列的公式为:Hi=(H(key)+di)% m ,其中的di=1,2,3,4...。所以H1=(4+1)%7=5,此时的单元5没有存数据,所以把74存入到5号单元。 接着存入第四个元素63,由于h(63)=63%7=0,此时的0号单元没有数据,所以把63存入0号单元。 接着存入第五个元素52,由于h(52)=52%7=3,此时的3号单元已被38占据,所以进行线性再散列:H1=(3+1)%7=4,但4号单元也被占据了,所以再次散列:H2=(3+2)%7=5,但5号单元也被占据了,所以再次散列:H3=(3+3)%7=6,6号单元为空,所以把52存入6号单元。 最后存入第六个元素48,由于h(48)=48%7=6,此时的6号单元已被占据,所以进行线性再散列:H1=(6+1)%7=0,但0号单元也被占据了,所以再次散列:H2=(6+2)%7=1,1号单元为空,所以把48存入1号单元。 如果一个元素存入时,进行了N次散列,相应的查找次数也是N,所以38,25,63这三个元素的查找长度为1,74的查找长度为2,48的查找长度为3,52的查找长度为4。所以平均查找长度为:(1+1+1+2+3+4)/6=2。
散列表A 0 1 2 3 4 5 6 元素 63 48 38 25 74 52 查找长度 1 3 1 1 2 4
快递排序的递归次数与元素的初始排列有关。如果每一次划分后分区比较平衡,则递归次数少;如果划分后分区不平衡,则递归次数多。但快速排序的递归次数与分区处理顺序无关,即先处理较长的分区或先处理较短的分区都不影响递归次数。
此外,可以形象地把快速排序的递归调用过程用一个二叉树描述,先处理较长或较短分区,可以想象为交换某一递归结点处的左右子树,这并不会影响树中的分支数。
第六层有2^(6-1)【32】个节点,所以有32-9=23个节点有子节点;
所以前六层节点总数(2^n)-1【63】个节点加上23*2个节点共有109个节点。
编程
微信红包
大概思路:先找出最多的众数,然后判断这个众数是否超过了数组的一半;
public class Gift { public int getValue(int[] gifts, int n) { // write code here int c=0; int count=0; //找出红包金额出现最多次的金额 for(int i=0;i<gifts.length;i++){ if(count==0){ c=gifts[i]; } if(c==gifts[i]){ count++; }else{ count--; } } int temp=0; //记录找到的金额出现的次数 for(int i=0;i<gifts.length;i++){ if(c==gifts[i]){ temp++; } } if(temp<gifts.length/2){ c=0; } return c; } }
计算字符串的编辑距离
import java.util.Scanner; /** * @editor biubiubiu */ public class Main { public static void main(String []args){ Scanner sc=new Scanner(System.in); String A=sc.nextLine(); String B=sc.nextLine(); System.out.println(Distance(A,B)); } private static int Distance(String str1, String str2) { char[] c1=str1.toCharArray(); char[] c2=str2.toCharArray(); int len1=c1.length; int len2=c2.length; int[][] dist=new int[len1+1][len2+1]; //初始状态:F(i,0)==i;F(0,j)==j; for (int i = 0; i <=len1; i++) { dist[i][0]=i; } for (int j = 0; j <= len2; j++) { dist[0][j]=j; } for (int i = 1; i <=len1 ; i++) { for (int j = 1; j <= len2; j++) { dist[i][j]=Math.min(dist[i-1][j]+1,dist[i][j-1]+1); if(c1[i-1]==c2[j-1]){ //如果相等 dist[i][j]=Math.min(dist[i][j],dist[i-1][j-1]); }else{ dist[i][j]=Math.min(dist[i][j],dist[i-1][j-1]+1); } } } return dist[len1][len2]; } }