第十五天
我使用的C++,错误的地方请见谅,文章初衷仅用来督促本人学习,如果恰巧能够给你带来帮助,我会十分开心。
一、5980. 将字符串拆分为若干长度为 k 的组
字符串 s 可以按下述步骤划分为若干长度为 k 的组:
第一组由字符串中的前 k 个字符组成,第二组由接下来的 k 个字符串组成,依此类推。每个字符都能够成为 某一个 组的一部分。
对于最后一组,如果字符串剩下的字符 不足 k 个,需使用字符 fill 来补全这一组字符。
注意,在去除最后一个组的填充字符 fill(如果存在的话)并按顺序连接所有的组后,所得到的字符串应该是 s 。
给你一个字符串 s ,以及每组的长度 k 和一个用于填充的字符 fill ,按上述步骤处理之后,返回一个字符串数组,该数组表示 s 分组后 每个组的组成情况 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/divide-a-string-into-groups-of-size-k
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution {
public:
vector<string> divideString(string s, int k, char fill) {
//先得出字符串字符的个数,然后对3求余数,得出需要补几个,然后分组
int n = s.size();
int m = n / k, l = n % k;//n + 1个数组,每个数组3个字符
if (l == 0){
m = m - 1;
}
vector<string> ans(m + 1);
int j = 0, i = 0;
for (int i = 0; i < n - l; i++){
ans[j].push_back(s[i]);
if (ans[j].size() == k){
j++;
}
}
if (l == 0){
return ans;
}
else {
for (int h = n - l; h < n; h++){
ans[j].push_back(s[h]);
}
for (int o = 0; o < k - l; o++){
ans[j].push_back(fill);
}
return ans;
}
}
};
二、5194. 得到目标值的最少行动次数
你正在玩一个整数游戏。从整数 1 开始,期望得到整数 target 。
在一次行动中,你可以做下述两种操作之一:
递增,将当前整数的值加 1(即, x = x + 1)。
加倍,使当前整数的值翻倍(即,x = 2 * x)。
在整个游戏过程中,你可以使用 递增 操作 任意 次数。但是只能使用 加倍 操作 至多 maxDoubles 次。
给你两个整数 target 和 maxDoubles ,返回从 1 开始得到 target 需要的最少行动次数。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-moves-to-reach-target-score
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution {
public:
int minMoves(int target, int maxDoubles) {
//奇数就减一,偶数就乘2,每乘一次二就对double加一,如果某次乘二后double变为max,后续操作只能减一
int dou = maxDoubles, n = target, count = 0;
while (n != 1 && dou != 0){
if (n % 2 == 0){//偶数
n = n / 2;
dou--;
count++;
}
else {//奇数
n -= 1;
count++;
}
}
if (maxDoubles == 0){
return n - 1;
}
else if (n == 1){//结束
return count;
}
else {//翻倍次数用完
return (count + (n - 1));
}
}
};
这次的周赛我做出来了两道题目,很严重的一个问题是代码不够简洁和严谨,在解题的时候逻辑不够流畅,还是做的题少,第一阶段我想先以周赛能够做出前三道问题为目标。基本上每次比赛前500人是可以完赛的。