【每日Day23】微信红包 && 求字符串的编辑距离

目录

一、选择题

二、编程题

1、微信红包

❎ 2、求字符串的编辑距离


一、选择题

【每日Day23】微信红包 && 求字符串的编辑距离_第1张图片

【每日Day23】微信红包 && 求字符串的编辑距离_第2张图片

【每日Day23】微信红包 && 求字符串的编辑距离_第3张图片

【每日Day23】微信红包 && 求字符串的编辑距离_第4张图片

【每日Day23】微信红包 && 求字符串的编辑距离_第5张图片

【每日Day23】微信红包 && 求字符串的编辑距离_第6张图片

【每日Day23】微信红包 && 求字符串的编辑距离_第7张图片

【每日Day23】微信红包 && 求字符串的编辑距离_第8张图片

 

 

【每日Day23】微信红包 && 求字符串的编辑距离_第9张图片

 

 

【每日Day23】微信红包 && 求字符串的编辑距离_第10张图片

【每日Day23】微信红包 && 求字符串的编辑距离_第11张图片


二、编程题

1、微信红包

【每日Day23】微信红包 && 求字符串的编辑距离_第12张图片

思路1:正常方法

1、对数组进行排序;

2、用变量count开始记录当前连续数字(肯定是相同数字)的个数;

3、用maxNum来更新个数的最大值;

4、一旦当前值和下一个值不相等了,说明不是同一个数字了,更新count值为1.

public static void main(String[] args) {

        int[] arr = {1,1,1,2};
        int res = getValue(arr,arr.length);
        System.out.println(res);
    }
    public static int getValue(int[] arr, int n) {
        //思路:方法1:写到map中并统计次数;
        //方法2:或者直接更新最大值
        //这里采用方法2
        int count = 1;
        //1、先对数组进行排序
        Arrays.sort(arr);
        //2、开始计数
        int maxNum = 1;
        //定义变量n来记录最大数量的i值
        int k = 0;
        for (int i = 0; i < arr.length-1; i++) {
           if(arr[i]==arr[i+1]){
               count++;
               //最大值与最新的count进行比较,更新最大值
               if(maxNum < count){
                   maxNum = count;
                   k = arr[i];
               }
           }else{
               count = 1;
           }
        }
        //同时判断n值是不是大于红包数量的一半,是的话就返回,不是的话就返回0
        if(maxNum >= arr.length/2){
            return k;
        }else{
            return 0;
        }
    }

方法2:一个数字如果出现次数最多,那么排序之后一定处于数组的中间位置。

1、数组排序

2、取出数组中间位置的数字,求该数字出现的次数;

3、判断该次数是不是超过了一半。

public int getValue(int[] gifts, int n) {
        //1、对数组进行排序
        Arrays.sort(gifts);
        //2、获取中间数据:也就是出现次数最多的数
        int mid = gifts[n/2];
        int count = 0;
        //3、统计中间位置的数据出现的次数
        for (int g: gifts) {
            if(g == mid){
                count++;
            }
        }
        //4、判断次数是不是超过了一半
        if(count > n/2){
            return mid;
        }else{
            return 0;
        }
    }

方法3:map集合。

 public int getValue(int[] gifts, int n) {
        //1、新建Map
        Map map = new HashMap<>();
        for (int g:gifts) {
            //2、如果key值是第一次出现,就将次数置为1
            if(!map.containsKey(g)){
               map.put(g,1);
            }
            //3、否则在原先次数上加1
            map.put(g,map.get(g)+1);
        }
        //4、遍历map,找出最大次数的map值
        //但是可以不找出最大次数:将每个次数都比较,判断是否大于一半就行。
        for (int g:gifts) {
            if(map.get(g) > n/2){
                return g;
            }
        }
        return 0;
    }

❎ 2、求字符串的编辑距离

【每日Day23】微信红包 && 求字符串的编辑距离_第13张图片 

【每日Day23】微信红包 && 求字符串的编辑距离_第14张图片

 

public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()){
            String str1 = sc.next();
            String str2 = sc.next();
            //定义二维数组
            int[][] res = new int[str1.length()+1][str2.length()+1];
            //初始化
            res[0][0] = 0;
            for (int i = 1; i <=str1.length() ; i++) {
                //初始化第一列
                res[i][0] = res[i-1][0]+1;
            }
            for (int j = 1; j <=str2.length() ; j++) {
                //初始化第一行
                res[0][j] = res[0][j-1]+1;
            }
            for (int i = 1; i <=str1.length() ; i++) {
                for (int j = 1; j <=str2.length() ; j++) {
                    res[i][j] = Math.min(res[i-1][j],res[i][j-1])+1;
                    //如果当前位置字符相等
                    if(str1.charAt(i-1) == str2.charAt(j-1)){
                        res[i][j] = Math.min(res[i][j],res[i-1][j-1]);
                    }else{
                        //当前位置的字符不相等
                        res[i][j] = Math.min(res[i][j],res[i-1][j-1]+1);
                    }
                }
            }
            System.out.println(res[str1.length()][str2.length()]);
        }
    }

【每日Day23】微信红包 && 求字符串的编辑距离_第15张图片

 

 

你可能感兴趣的:(每日编程48Days,java,开发语言)