1984 题目描述✨:
给你一个 下标从 0 开始 的整数数组 nums ,其中 nums[i] 表示第 i 名学生的分数。另给你一个整数 k 。
从数组中选出任意 k 名学生的分数,使这 k 个分数间 最高分 和 最低分 的 差值 达到 最小化 。
返回可能的 最小差值 。
示例 1:
输入:nums = [90], k = 1
输出:0
解释:选出 1 名学生的分数,仅有 1 种方法:
- [90] 最高分和最低分之间的差值是 90 - 90 = 0
可能的最小差值是 0
示例 2:
输入:nums = [9,4,1,7], k = 2
输出:2
解释:选出 2 名学生的分数,有 6 种方法:
- [9,4,1,7] 最高分和最低分之间的差值是 9 - 4 = 5
- [9,4,1,7] 最高分和最低分之间的差值是 9 - 1 = 8
- [9,4,1,7] 最高分和最低分之间的差值是 9 - 7 = 2
- [9,4,1,7] 最高分和最低分之间的差值是 4 - 1 = 3
- [9,4,1,7] 最高分和最低分之间的差值是 7 - 4 = 3
- [9,4,1,7] 最高分和最低分之间的差值是 7 - 1 = 6
可能的最小差值是 2
解题思路✨:
这道题可以用滑动窗口来解决
设定两个滑动窗口 i 和 j i代表左区间 j 代表右区间
开始为空窗口 i=0 ,j=-1
先移动右窗口当不满足条件就移动左窗口直到窗口的长度为k时 返回所有窗口中的最小值就是我们要的答案了
代码附上✨:
class Solution { public int minimumDifference(int[] nums, int k) { Arrays.sort(nums); int n=nums.length; int i=0; int j=-1; int ans=100001; while(j<n-1){ j++; while(j-i+1>k){ i++; } if(j-i+1==k){ ans=Math.min(ans,nums[j]-nums[i]); } } return ans; } }
2269题目描述✨:
一个整数 num 的 k 美丽值定义为 num 中符合以下条件的 子字符串 数目:
子字符串长度为 k 。
子字符串能整除 num 。
给你整数 num 和 k ,请你返回 num 的 k 美丽值。
注意:
允许有 前缀 0 。
0 不能整除任何值。
一个 子字符串 是一个字符串里的连续一段字符序列。
示例 1:
输入:num = 240, k = 2
输出:2
解释:以下是 num 里长度为 k 的子字符串:
- "240" 中的 "24" :24 能整除 240 。
- "240" 中的 "40" :40 能整除 240 。
所以,k 美丽值为 2 。
示例 2:
输入:num = 430043, k = 2
输出:2
解释:以下是 num 里长度为 k 的子字符串:
- "430043" 中的 "43" :43 能整除 430043 。
- "430043" 中的 "30" :30 不能整除 430043 。
- "430043" 中的 "00" :0 不能整除 430043 。
- "430043" 中的 "04" :4 不能整除 430043 。
- "430043" 中的 "43" :43 能整除 430043 。
所以,k 美丽值为 2 。
解题思路✨:
这道题直接正常模拟就行 判断非0是否整除
代码附上:
class Solution { public int divisorSubstrings(int num, int k) { int count=0; String str=String.valueOf(num); //将整型转化为字符串 for(int i=0;i<str.length()-k+1;i++){ int t=Integer.parseInt(str.substring(i,i+k));//将字符串转化为整数 if(t==0){ continue; }else{ if(num%t==0){ count++; } } } return count; } }
1763题目描述✨:
当一个字符串 s 包含的每一种字母的大写和小写形式 同时 出现在 s 中,就称这个字符串 s 是 美好 字符串。比方说,"abABB" 是美好字符串,因为 'A' 和 'a' 同时出现了,且 'B' 和 'b' 也同时出现了。然而,"abA" 不是美好字符串因为 'b' 出现了,而 'B' 没有出现。
给你一个字符串 s ,请你返回 s 最长的 美好子字符串 。如果有多个答案,请你返回 最早 出现的一个。如果不存在美好子字符串,请你返回一个空字符串。
示例 1:
输入:s = "YazaAay"
输出:"aAa"
解释:"aAa" 是一个美好字符串,因为这个子串中仅含一种字母,其小写形式 'a' 和大写形式 'A' 也同时出现了。
"aAa" 是最长的美好子字符串。
示例 2:
输入:s = "Bb"
输出:"Bb"
解释:"Bb" 是美好字符串,因为 'B' 和 'b' 都出现了。整个字符串也是原字符串的子字符串。
示例 3:
输入:s = "c"
输出:""
解释:没有美好子字符串。
示例 4:
输入:s = "dDzeE"
输出:"dD"
解释:"dD" 和 "eE" 都是最长美好子字符串。
由于有多个美好子字符串,返回 "dD" ,因为它出现得最早。
解题思路✨:
枚举:
根据题意可知,美好字符串的定义是:每一种字母的大写和小写形式 同时 出现在 s 中,就称这个字符串 s 是 美好 字符串
由于英文字母‘a’−‘z’ 最多只有 26 个, 因此可以利用二进制位来进行标记,a标记字符中出现过小写英文字母,b标记字符中出现过大写英文字母
如果满足 a=b ,我们则认为字符串中所有的字符都满足大小写形式同时出现,则认定该字符串为美好字符串。
题目要求如果出现多个美好字符串,返回最早出现的
我们首先需要检测出以字符串索引为0起始的子字符串
代码附上✨:
class Solution { public String longestNiceSubstring(String s) { int n = s.length(); int index = -1, len = 0; for (int i = 0; i < n; i++) { int a = 0, b = 0; for (int j = i; j < n; j++) { char c = s.charAt(j); if (c >= 'a' && c <= 'z') a |= (1 << (c - 'a')); else b |= (1 << (c - 'A')); if (a == b && j - i + 1 > len) { index = i; len = j - i + 1; } } } return index == -1 ? "" : s.substring(index, index + len); } }
以上就是小王同学带给大家的关于滑动窗口的题目