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;
}
}