leetcode每周.周赛第276场周赛 字符模拟+ 贪心递归考察 + 动归考察 简单与中等 谁说打了周赛会动不了笔

📖本篇内容:leetcode每周.周赛第276场周赛 字符模拟+ 贪心考察 + 动归考察 简单与中等 谁说打了周赛会动不了笔

📑 文章专栏:leetcode周赛打卡《周周打卡》

📆 最近更新:2022年1月16日 leetcode每周.周赛第277场周赛

🙊个人简介:一只二本院校在读的大三程序猿,本着注重基础,打卡算法,分享技术作为个人的经验总结性的博文博主,虽然可能有时会犯懒,但是还是会坚持下去的,如果你很喜欢博文的话,建议看下面一行~(疯狂暗示QwQ)

🌇 点赞 👍 收藏 ⭐留言 📝 一键三连 关爱程序猿,从你我做起

写在前面

🙊小付来喽,今天整点不一样的板块,因为今天小付第一次开始打周赛,也因为记录一下leetcode周赛周日志,来加深一下现如今的部分企业对基础算法的要求等,也当是对自己算法只是再次理解应用,话不多说,来看看这第276场周赛,有些什么妖魔鬼怪题。

第276场周赛——2022-01-16

T1.5980. 将字符串拆分为若干长度为 k 的组

题目

字符串s可以按下述步骤划分为若干长度为 k的组:
第一组由字符串中的前 k 个字符组成,第二组由接下来的 k 个字符串组成,依此类推。每个字符都能够成为某一个组的一部分
对于最后一组,如果字符串剩下的字符 不足 k 个,需使用字符 fill补全这一组字符。
注意,在去除最后一个组的填充字符 fill(如果存在的话)并按顺序连接所有的组后,所得到的字符串应该是 s 。
给你一个字符串s,以及每组的长度k和一个用于填充的字符fill,按上述步骤处理之后,返回一个字符串数组,该数组表示 s分组后 每个组的组成情况 。

示例

示例1:

输入:s = "abcdefghi", k = 3, fill = "x"
输出:["abc","def","ghi"]
解释:
前 3 个字符是 "abc" ,形成第一组。
接下来 3 个字符是 "def" ,形成第二组。
最后 3 个字符是 "ghi" ,形成第三组。

示例2:

输入:s = "abcdefghij", k = 3, fill = "x"
输出:["abc","def","ghi","jxx"]
解释:
与前一个例子类似,形成前三组 "abc"、"def" 和 "ghi" 。
对于最后一组,字符串中仅剩下字符 'j' 可以用。为了补全这一组,使用填充字符 'x' 两次。
因此,形成 4 组,分别是 "abc"、"def"、"ghi" 和 "jxx" 。

提示

1 <= s.length <= 100
s 仅由小写英文字母组成
1 <= k <= 100
fill 是一个小写英文字母

思路

一道简单的字符模拟题,主要就是最后一组数字需要进行判断,是否此时已经全部添加,还是需要填充

代码实现

class Solution {
    public String[] divideString(String s, int k, char fill) {
    	//构建一个链表用来记录 组数据
        List<String> list = new ArrayList<>();
        int n = s.length();
        //为的是除去最后一组数据之前的每k个字符拼凑到链表中
        for (int i = 0;i<=n-k;i+=k){
            list.add(s.substring(i,i+k));
        }
        //到最后一组数据时进行判断是否需要填充
        if (n % k == 0)
            return list.toArray(new String[0]);
        else {
        //需要填充就按照下述方式进行填充
            StringBuilder sb = new StringBuilder();
            sb.append(s.substring(n - n%k,n));
            for (int i = n%k;i<k;i++){
                sb.append(fill);
            }
            list.add(sb.toString());
            return list.toArray(new String[0]);
        }
    }
}

执行结果

在这里插入图片描述

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

题目

你正在玩一个整数游戏。从整数 1 开始,期望得到整数 target 。
在一次行动中,你可以做下述两种操作之一:
递增,将当前整数的值加 1(即, x = x + 1)
加倍,使当前整数的值翻倍(即,x = 2 * x)
在整个游戏过程中,你可以使用 递增 操作 任意 次数。但是只能使用 加倍 操作 至多maxDoubles 次。
给你两个整数 target 和 maxDoubles ,返回从 1开始得到 target 需要的最少行动次数

示例

示例1:

输入:target = 5, maxDoubles = 0
输出:4
解释:一直递增 1 直到得到 target 。

示例2:

输入:target = 19, maxDoubles = 2
输出:7
解释:最初,x = 1 。
递增 3 次,x = 4 。
加倍 1 次,x = 8 。
递增 1 次,x = 9 。
加倍 1 次,x = 18 。
递增 1 次,x = 19 。

思路

简单递归 / 贪心

代码实现

class Solution {
    public int minMoves(int target, int maxDoubles) {
    	//设置递归终止条件
        if (target == 1) return 0;
        //当没有倍增次数返回 target-1 次
        if (maxDoubles == 0) return target - 1;
        //返回 当maxDoubles不为0进行倍增计算 次数 + 1递归计算                                                                 
        return target % 2 + 1 + minMoves(target / 2, maxDoubles - 1);
    }
}

执行结果

在这里插入图片描述

T3.5982. 解决智力问题

题目

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

示例

示例1:

输入:questions = [[3,2],[4,3],[4,4],[2,5]]
输出:5
解释:解决问题 0 和 3 得到最高分。
- 解决问题 0 :获得 3 分,但接下来 2 个问题都不能解决。
- 不能解决问题 1 和 2
- 解决问题 3 :获得 2 分
总得分为:3 + 2 = 5 。没有别的办法获得 5 分或者多于 5 分。

提示

1 <= questions.length <= 10^5
questions[i].length == 2
1 <= pointsi, brainpoweri <= 10^5

思路

简单的dp问题,但是我却想歪边界了,感觉是我智力有问题。
动态规划的难点在于找到动态转化方程,但是此题已经基本在题中给你了,所以直接动手就好啦。

代码实现

class Solution {
    public long mostPoints(int[][] questions) {
        int n = questions.length;
        long dp [] = new long[n+1];
		//倒序dp 存储的是当前位置可获得的最大分数
        for (int i = n-1;i>=0;i--){
        	//如果做了当前题 需要调过 questions[i][1]道题 判断范围 如果当前位置+跳过的题>边界,那么选它的话后面的都不能选,最高分为questions[i][0] 反之后面还能选择
            if (i + questions[i][1] + 1< n){
                dp[i] = Math.max(dp[i+1],dp[i+questions[i][1]+1]+questions[i][0]);
            }else dp[i] = Math.max(dp[i+1],questions[i][0]);
        }
        return dp[0];
    }
}

执行结果

在这里插入图片描述

写在最后

小付打卡的第一场周赛 2022-01-16

因为最后一题 一般没时间做到那里 自知自身能力有限

尽可能把会做的题 都做好 就可以了

本次周赛 对了两道 第三道一开始小付是正序dp被边界直接自毙

所以还是很不错的周赛体验

最后

每天进步点 每天收获点

愿诸君 事业有成 学有所获

如果觉得不错 别忘啦一键三连哦~

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Alascanfu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值