每日训练-day23

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。

散列表A0123456
元素634838257452
查找长度131124

 快递排序的递归次数与元素的初始排列有关。如果每一次划分后分区比较平衡,则递归次数少;如果划分后分区不平衡,则递归次数多。但快速排序的递归次数与分区处理顺序无关,即先处理较长的分区或先处理较短的分区都不影响递归次数。

此外,可以形象地把快速排序的递归调用过程用一个二叉树描述,先处理较长或较短分区,可以想象为交换某一递归结点处的左右子树,这并不会影响树中的分支数。

第六层有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];
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值