Leetcode Weekly Contest 261(数学推理、贪心)

题目链接: Leetcode Weekly Contest 261

1、2027. Minimum Moves to Convert String

难度:Easy

代码:

class Solution {
    public int minimumMoves(String s) {
        char[] a=s.toCharArray();
        int res=0;
        for(int i=0;i<a.length;){
            if(a[i]=='X'){
                res++;
                i+=3;
            }
            else{
                i++;
            }
        }
        return res;
    }
}

2、2028. Find Missing Observations

难度:Medium

代码:

class Solution {
    public int[] missingRolls(int[] rolls, int mean, int n) {
        int m=rolls.length;
        int sum=mean*(m+n);
        for(int r:rolls){
            sum-=r;
        }
        if(sum<n||sum>6*n){
            int[] res=new int[0];
            return res;
        }
        int b=sum%n;
        int a=sum/n;
        int[] res=new int[n];
        Arrays.fill(res,a);//先平均分配
        for(int i=0;i<b;i++){//分配余数
            res[i]++;
        }
        return res;
    }
}

3、2029. Stone Game IX

难度:Medium

思路:

参考高赞回答,数学推理题,比较难。

代码

class Solution {
    public boolean stoneGameIX(int[] stones) {
        int[] cnt=new int[3];
        //cnt[i]表示stones[]%3=i的个数
        for(int a:stones){
            cnt[a%3]++;
        }
        if( (cnt[0]%2==0&&cnt[1]>0&&cnt[2]>=cnt[1])||(cnt[0]%2==0&&cnt[2]>0&&cnt[1]>=cnt[2])){
            //1,[1,2,1,2,...],2(还能剩下很多2)
            //2,[2,1,2,1,...],1//第一种情况的对偶
            return true;
        }
        if( (cnt[0]%2==1&&(cnt[1]-cnt[2]>=3))||(cnt[0]%2==1&&(cnt[2]-cnt[1]>=3)) ){
            //1,[1,2,1,2,...],0,1(还能剩下很多1)
            //2,[2,1,2,1,...],0,2//第一种情况的对偶
            return true;
        }
        return false;
    }
}

4、2030. Smallest K-Length Subsequence With Occurrences of a Letter

难度:Hard

思路

贪心,参考高赞回答

代码

class Solution {
    public String smallestSubsequence(String s, int k, char letter, int repeat) {
        char[] str=s.toCharArray();
        int n=str.length;
        int count=0;
        for(char c:str){
            if(c==letter){
                count++;
            }
        }
        Stack<Character> stack=new Stack<>();
        for(int i=0;i<n;i++){
            char c=str[i];
            while(!stack.isEmpty()&&stack.peek()>c&&n-i+stack.size()-1>=k&&(stack.peek()!=letter||count>repeat)){
                //n-i+stack.size()-1>=k保证弹出栈顶元素后还能凑够k个字符
                //stack.peek()!=letter||count>repeat保证能凑够repeat个letter
                if(stack.peek()==letter){
                    repeat++;//还需要多少个letter字符
                }
                stack.pop();
            }
            if(stack.size()<k){
                if(c==letter){
                    stack.push(c);
                    repeat--;
                }
                else if(k-stack.size()-repeat>0){//还需要多少个不是letter的字符
                    stack.push(c);
                }
            }
            if(c==letter){
                count--;//剩余的字符中还有多少个为letter的字符
            }
        }
        StringBuilder sb=new StringBuilder();
        while(!stack.isEmpty()){
            sb.append(stack.pop());
        }
        return sb.reverse().toString();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值