蓝桥杯第七弹

第一题

class Solution {
    public int minimumDifference(int[] nums, int k) {
      Arrays.sort(nums);  
      int min=100;
      int num2[]=new int[k];
      if(k==1){
          min=0;
      }else{
      for(int i=0;i<nums.length-1;i++){
          int m=0;
          
          while(m<k){
              num2[m]=nums[i];
              m++;
          }
        min=Math.min(min,(num2[k-1]-num2[0]));
          }
      }
          return min;
    }
}

思路:首先对nums数组排序,便于出k个相邻的元素 的最小差值,再对多组最小差值进行比较,得出整个数组中k个相邻的元素 的最小差值。

第二题

class Solution {
    public int numSubarrayProductLessThanK(int[] nums, int k) {
       int num=0;
	        for(int i=0;i<nums.length;i++){
	            int ji=1;
	            int m=0;
	            while(i<nums.length&&ji*nums[i]<k){
	                ji*=nums[i];
	                i++;
	                m++;	                
	            }
	            num+=m;
	            i-=m;
	        } 
        return num;
    }
}

思路:先遍历数组nums,将从nums[i]开始相邻的元素乘积与k比较,小于k则 m++,将所有m加起来就是元素乘积小于k的子数组数量。

第三题

class Solution {
    public int maxConsecutiveAnswers(String answerKey, int k) {
        return Math.max(maxConsecutiveChar(answerKey,k,'T'),maxConsecutiveChar(answerKey,k,'F'));
    }
   public int maxConsecutiveChar(String answerKey, int k, char ch) {
        int n = answerKey.length();
        int ans = 0;
        for (int left = 0, right = 0, sum = 0; right < n; right++) {
            sum += answerKey.charAt(right) != ch ? 1 : 0;
            while (sum > k) {
                sum -= answerKey.charAt(left++) != ch ? 1 : 0;
            }
            ans = Math.max(ans, right - left + 1);
        }
        return ans;

   }
}

思路:通过写一个方法,分别判断是修改T还是修改F可得到最长子串。用两个指针来制作一个滑动窗口,以right指针为主,T为例,如果所读的字符不是T,则表示这个字符可能需要修改,sum加一。如果sum>k则需要left指针来保证需修改字符数量不得大于k。left指针右移,当读到字符为F时,sum减一,直至sum<=k,才可计算left指针到right指针之间元素个数。所得个数用ans记录,每次将较大的数付给ans,最终得到修改k次后最长子串。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值