不同整数的最少数目和单词直接最短距离

本文分享了两个编程题目:1)给定整数数组和移除元素数量,找到移除后不同整数的最少数目;2)在单词列表中找到两个指定单词的最短距离。作者展示了如何用Java代码解决这些问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写是为了更好的思考,坚持写作,力争更好的思考。
今天分享两个关于“最小、最短”的算法题,废话少说,show me your code!

一、不同整数的最少数目

给你一个整数数组arr和一个整数k。现需要从数组中恰好移除k个元素,请找出移除后数组中不同整数的最少数目?
输入:
arr=[5,4,5],k=1
输出:1
解释:
移除1个4,数组中只剩下5一种整数
输入:
arr=[4,3,1,1,3,3,2],k=3
输出:2 解释:先移除4,2然后再移除两个1中任意1个1或者移除两个3中的任意1个3,最后剩余1和3两种整数类型

public static int getMinDifference(int[] arr, int k) {
        // key存放数组数字,value存放次数
        Map<Integer, Integer> map = new HashMap<>();
        for (int i : arr) {
            map.put(i, map.getOrDefault(i, 0) + 1);
        }
        // 对次数按照自然顺序排序即由小到大
        List<Integer> countNumList = map.values().stream().sorted().collect(Collectors.toList());
        // 不同种类组成的list的长度
        int size = countNumList.size();
        for (Integer count : countNumList) {
            // 由于countNumList由小到大有序,则每次从左边开始剔除数字,使得最终种类最少
            // 遍历countNumList,如果k>=当前次数,则直接删除,种类减少1即size--
            if (k >= count) {
                k -= count;
                size--;
            } else {
                // 如果k<当前次数,则删除当前次数1次后,总的种类并无变化,所以直接终止for循环,
                // 不用再继续判断下一个数字了(因为countNumList有序)
                break;
            }
        }
        return size;
    }

二、单词直接最短距离

给定一个单词列表arr和word1,word2,求出这两个单词之间的最短距离word1,word2不相等且均在arr列表中

public static int getMinDistance(String[] arr, String word1, String word2) {
        // 在for循环外定义2个变量,用于存储word1,word2的索引下标,注意要用-1表示,否则会计算出错
        // 将两者索引下标之差的绝对值进行比较,取最小值(注意pos1和pos2均不为空)
        int pos1 = -1;
        int pos2 = -1;
        int minDistance = Integer.MAX_VALUE;
        for (int i = 0; i < arr.length; i++) {
            if (word1.equals(arr[i])) {
                pos1 = i;
            } else if (word2.equals(arr[i])) {
                pos2 = i;
            }
            if (pos1 >= 0 && pos2 >= 0) {
                minDistance = Math.min(minDistance, Math.abs(pos1 - pos2));
            }
        }
        return minDistance;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值