题目
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
次。
给你两个整数target
和maxDoubles
,返回从 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
分,但你不能解决问题1
和2
。- 如果你跳过问题
0
,且解决问题1
,你将获得4
分但是不能解决问题2
和3
。请你返回这场考试里你能获得的 最高 分数。
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才能快速的做出第三题!