蓝桥杯第六弹

第一题

class Solution {
    public int findContentChildren(int[] g, int[] s) {
        int num=0;
        int max=Math.max(g.length,s.length);
        int min=Math.min(g.length,s.length);
        for(int i=0;i<max;i++){
            for(int j=0;j<min;j++){
                
                if(g.length>s.length&&s[j]>=g[i]){
                    num++;
                    i++;
                }else if(i<m&&g.length<=s.length&&s[i]>=g[j]){
                    num++;
                    i++;
                }
                
                if(j==min-1) {

                    break;
                };

            }
        }
        return num;
    }
}

 

利用双指针,如果s[j]>=g[i]成立,就将num加一,将两个指针都往后移一位。值得注意的是for循环的条件,如果g.length<=s.length,g.length 为内循环终止条件,以内层循环为主,如果不满足题意,i将加一,继续与每个g[j]比较,满足时,i后移一位,与下一个g[j]比较,直至g[i]比较完毕。如果g.length>s.length,以g.length为外层条件,如果满足题意,i++,否则i不加,g[i]接着与下一个s[j]比较,将s[j]比较一遍后,循环结束。前者外层循环可能不止一次,后者外层循环只有一次。

第二题

class Solution {
    public int maxmiumScore(int[] cards, int cnt) {
        int msum=0;
        Arrays.sort(cards);
        int j=0;
        for(int i=cards.length-1;i>0;i--){
            int sum=0;
            int n=cnt;
            if(cnt==1&&cards[i]%2==0){
               //sum=cards[i];
                msum=cards[i];
            }else if(cnt>1){
                //int hhh=cards.length-1;
                while(n>0){

                sum+=cards[i];
                i--;
                n--;
                }
                // if(n>0){
                    
                //     n--;
                // }
                if(sum%2==0){
                    msum=sum;
                }else{
                    int a=0;
                    int b=0;
                    if(cards[i+1]%2==0){
                        
                      while(i>=0&&cards[i]%2!=0){
                           a=sum-cards[i+1]+cards[i];
                           i--;
                      }  
                    }else if(cards[i+1]%2!=0){
                        //i++;
                    while(i>=0&&cards[i]%2==0){
                           b=sum-cards[i+1]+cards[i];
                           i--;
                      }  
                    }
                    
                    msum=Math.max(a,b);

                }
            }
            // if(sum%2==0){
            //     msum=Math.max(msum,sum);
            // }
        }
        return msum;
    }
}

思路:首先对数组进行升序排序,如果只需抽取一张牌时,从数组末尾寻找最大的偶数,并返回。如果需要抽取多张时,用sum存储cnt个最大的数组元素,然后判断sum是否是偶数,如果是,则返回,如果不是且没有抽取完所有的牌,则分两个方案,去除一个奇数,增加一个剩余元素中的最大的偶数,或取出一个偶数,增加一个最大的奇数,最后比较这两个方案中的和的最大值,然后返回这个最大值。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值