819. 最常见的单词 / 剑指 Offer II 008. 和大于等于 target 的最短子数组

本文解析了如何通过模拟和动态窗口技巧解决编程难题:寻找段落中最常出现但不在禁用列表中的单词,以及找到和目标值相等或大于的最短子数组。通过实例演示了HashMap、HashSet的运用和滑动窗口算法的应用。
摘要由CSDN通过智能技术生成

819. 最常见的单词【简单题】【每日一题】

思路:

模拟。将禁用列表存入hashset,将段落中的单词存入hashmap,value对应单词出现的次数,如果单词在banned列表中存在,则不将其加入hashmap。

代码:

class Solution {
    public String mostCommonWord(String paragraph, String[] banned) {
        Map<String,Integer> map = new HashMap<>();//建立段落中单词的哈希表,如果遇到大写就将其转为小写
        Set<String> set = new HashSet<>(Arrays.asList(banned));//将banned转为hashset
        char[] chars = paragraph.toCharArray();
        int len = chars.length,max = 0;
        String ans = "";
        for (int i = 0; i < len; i++) {
            if (Character.isLetter(chars[i])){//如果当前字符是字母
                int j = i;
                while (j<len){//找到不是字母的结束位置
                    if (!Character.isLetter(chars[j])){
                        break;
                    }
                    j++;
                }
                //将段落中i和j之间的字符截取出来就是单词,并将其转为全部小写
                String key = paragraph.substring(i,j).toLowerCase();
                if (!set.contains(key)){//如果单词key不在禁用列表中
                    map.put(key,map.getOrDefault(key,0)+1);//将key在hashmap中对应的value+1
                    if (map.get(key)>max){//如果key对应的value大于当前最大值max
                        max = map.get(key);//将max更新
                        ans = key;//将最大长度的单词ans更新为当前key
                    }
                }
                i = j;//将i更新为j,继续下一个遍历
            }
        }
        return ans;
    }
}

剑指 Offer II 008. 和大于等于 target 的最短子数组【中等题】

思路:

采用滑动窗口动态更新子数组的元素和以及子数组的长度

代码:

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int sum = 0, len = nums.length,i = 0;
        int min = 100001,start = 0;
        while (i < len){
            sum += nums[i];//累加sum
            while (sum >= target){//当sum大于等于目标时,将sum减掉左侧的start位置对应的数字,并将start右移,直到sum重新小于target为止
                //i-start+1(设为x)表示当前区间内的数字和
                //当sum > target时,x一定比最小的min要大,
                //当sum = target时,x与此前最小的min比较大小
                //所以可将上述两种情况整合到一起,统一将min更新为 Math.min(min,i-start+1)
                min = Math.min(min,i-start+1);
                //更新sum 以及 start 位置
                sum -= nums[start++];
            }
            i++;//正常右移
        }
        //当min仍为100001时,说明min并没有进行更新,这种情况说明不存在符合条件的子数组,根据题目要求此时返回0
        return min == 100001 ? 0 : min;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值