第276场周赛总结

题目

1 将字符串拆分为若干长度为 k 的组

字符串 s 可以按下述步骤划分为若干长度为 k 的组:

  • 第一组由字符串中的前 k 个字符组成,第二组由接下来的 k 个字符串组成,依此类推。每个字符都能够成为 某一个 组的一部分。
  • 对于最后一组,如果字符串剩下的字符 不足 k 个,需使用字符 fill 来补全这一组字符。

注意,在去除最后一个组的填充字符 fill(如果存在的话)并按顺序连接所有的组后,所得到的字符串应该是 s
给你一个字符串 s ,以及每组的长度 k 和一个用于填充的字符 fill ,按上述步骤处理之后,返回一个字符串数组,该数组表示 s 分组后 每个组的组成情况

PS:算是开胃菜,第一道题一般都是题目意思理解好就是常规easy
题目

public String[] divideString(String s, int k, char fill) {
    List<String> res = new ArrayList<>();
    //1 可以直接处理部分
    int part = s.length() / k;
    for(int i = 0;i < part;i++){
        int start = i * k;
        int end = (i + 1) * k;
        res.add(s.substring(start,end));
    }
    //2 需要填充部分
    int start = part * k;
    if(start < s.length()){     
        String last = s.substring(start);
        while(last.length() < k){
            last += fill;
        }
        res.add(last);
    }
    String []ans = new String[res.size()];
    for(int i = 0;i < res.size();i++)ans[i] = res.get(i);
    return ans;
}
}

2 5194. 得到目标值的最少行动次数

你正在玩一个整数游戏。从整数 1 开始,期望得到整数 target
在一次行动中,你可以做下述两种操作之一:

  • 递增,将当前整数的值加 1(即, x = x + 1)。
  • 加倍,使当前整数的值翻倍(即,x = 2 * x)。

在整个游戏过程中,你可以使用 递增 操作 任意 次数。但是只能使用 加倍 操作 至多 maxDoubles 次。
给你两个整数 targetmaxDoubles ,返回从 1 开始得到 target 需要的最少行动次数。

PS:

    public int minMoves(int target, int maxDoubles) {
        int res = 0;
        while(maxDoubles > 0){
            if(target == 1)break;
            if(target % 2 == 1)res++;
            target /= 2;
            res++;
            maxDoubles --;
        }
        res += target - 1;
        return res;
    }

3 5982. 解决智力问题

给你一个下标从 0 开始的二维整数数组 questions ,其中 questions[i] = [pointsi, brainpoweri]
这个数组表示一场考试里的一系列题目,你需要 按顺序 (也就是从问题 0 开始依次解决),针对每个问题选择 解决 或者 跳过 操作。解决问题 i 将让你 获得 pointsi 的分数,但是你将 无法 解决接下来的 brainpoweri 个问题(即只能跳过接下来的 brainpoweri 个问题)。如果你跳过问题 i ,你可以对下一个问题决定使用哪种操作。

  • 比方说,给你 questions = [[3, 2], [4, 3], [4, 4], [2, 5]]
    • 如果问题 0 被解决了, 那么你可以获得 3 分,但你不能解决问题 12
    • 如果你跳过问题 0 ,且解决问题 1 ,你将获得 4 分但是不能解决问题 23

请你返回这场考试里你能获得的 最高 分数。

public long mostPoints(int[][] questions) {
    int len = questions.length;
    long []dp = new long[len + 2];
    for(int i = len - 1;i >= 0;i--){
        int store = questions[i][0];
        int cost = questions[i][1];
        if(i + cost + 1 < len){
            // 后面还有题目
            dp[i] = Math.max(dp[i + 1],store + dp[i + cost + 1]);
        }else{
            //此时表示这道题目做完就没有题目好做了
            if(i == len - 1){
                //最后一个元素直接为store
                dp[i] = store;
            }else{
                // 应该为最后这些超出边界的题目中最大的题目
                dp[i] = Math.max(dp[i + 1],store);
            }
        }
    }
    return dp[0];
}

4 5983. 同时运行 N 台电脑的最长时间

你有 n 台电脑。给你整数 n 和一个下标从 0 开始的整数数组 batteries ,其中第 i 个电池可以让一台电脑 运行 batteries[i] 分钟。你想使用这些电池让 全部 n 台电脑 同时 运行。
一开始,你可以给每台电脑连接 至多一个电池 。然后在任意整数时刻,你都可以将一台电脑与它的电池断开连接,并连接另一个电池,你可以进行这个操作 任意次 。新连接的电池可以是一个全新的电池,也可以是别的电脑用过的电池。断开连接和连接新的电池不会花费任何时间。
注意,你不能给电池充电。
请你返回你可以让 n 台电脑同时运行的 最长 分钟数。

首先对电池数组排序,从大数向小数遍历
设 电池总量为sum,电脑个数为num,平均电量 sum / num = n
两种情况
1、bar[i] > n
此时表示该电池无论如何都会被充分利用,既不需要考虑该电池
2、bar[i] <= n
直接返回 sum / num
舍弃大电池的部分就是从答案的上界逼近真正答案的过程,由于电池可以随意断开连接,所以直接考虑平均值就是答案,降序遍历,到第一个小于等于均值的电池电量即位我们所需的答案。

public long maxRunTime(int n, int[] batteries) {
    long sum = 0;
    for(int bar : batteries)sum += bar;
    Arrays.sort(batteries);
    for(int i = batteries.length - 1;i >= 0;i--){
        int bar = batteries[i];
        if(bar > sum / n){
            sum -= bar;
            n--;
        }else{
           return sum / n;
        }
    }
    return 0;
}

总结


四道题目,第三道题目卡了最久,终于在最后十分钟做出来了,dp还是不够熟悉,熟悉dp才能快速的做出第三题!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值