持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第16天,点击查看活动详情
前言
小白算法比较菜,希望能激励我每日更新,从leetcode第一题开始,2022年目标300题,记录从0到1的全过程!!
力扣第 314 场周赛-力扣
力扣第 314 场周赛-力扣
真是坐牢,a了两题,第三题一直超时,结果排名还是1285,比之前三题的时候排名都高。看来这次确实有点难。
后来发现第三题,我一直把stringbuffer和stringbuilder记反了!!提交的时候用的stringbuffer,换一下就可以过了。。。。虽然也就只能上升个一两百的排名吧,1050左右。唉 又没上成分
第88双周赛的排名
第313周赛的排名
2434. 使用机器人打印字典序最小的字符串
给你一个字符串 s 和一个机器人,机器人当前有一个空字符串 t 。执行以下操作之一,直到 s 和 t 都变成空字符串:
- 删除字符串 s 的 第一个 字符,并将该字符给机器人。机器人把这个字符添加到 t 的尾部。
- 删除字符串 t 的 最后一个 字符,并将该字符给机器人。机器人将该字符写到纸上。
- 请你返回纸上能写出的字典序最小的字符串。
示例 1
- 输入:s = "zza"
- 输出:"azz"
- 解释:用 p 表示写出来的字符串。
- 一开始,p="" ,s="zza" ,t="" 。
- 执行第一个操作三次,得到 p="" ,s="" ,t="zza" 。
- 执行第二个操作三次,得到 p="azz" ,s="" ,t="" 。
示例 2
- 输入:s = "bac"
- 输出:"abc"
- 解释:用 p 表示写出来的字符串。
- 执行第一个操作两次,得到 p="" ,s="c" ,t="ba" 。
- 执行第二个操作两次,得到 p="ab" ,s="c" ,t="" 。
- 执行第一个操作,得到 p="ab" ,s="" ,t="c" 。
- 执行第二个操作,得到 p="abc" ,s="" ,t="" 。
示例 3
- 输入:s = "bdda"
- 输出:"addb"
- 解释:用 p 表示写出来的字符串。
- 一开始,p="" ,s="bdda" ,t="" 。
- 执行第一个操作四次,得到 p="" ,s="" ,t="bdda" 。
- 执行第二个操作四次,得到 p="addb" ,s="" ,t="" 。
提示
1 <= s.length <= 105s只包含小写英文字母。
代码
这次挺无语的是,一直把stringbuilder和stringbuffer记反了。导致,超时没过。之前确实一直都没分清楚,相信这是一个深刻的教训,以后不会分不清了。
这个题的思路其实很简单,类似于栈吧,不过有两个栈,一个是s,一个是t.
这里分析一个例子
结合代码看,其实很容易看懂0.0
真是太服了我自己了,写了就就有机会进前1000啊,唉
例1
"aabcdabcd" ===>"aaabcdcbd"
class Solution {
public String robotWithString(String s) {
StringBuilder sb = new StringBuilder(s);
StringBuilder res = new StringBuilder();
int r = 0;
int c = 0;
while (r < sb.length()) {
int[] min = findMin(sb, r, sb.length(), c);
c = min[1];
if (r > 0) {
while (r > 0 && sb.charAt(r - 1) - 'a' <= min[1] ) {
res.append(sb.charAt(r - 1));
sb.deleteCharAt(r - 1);
r--;
min[0]--;
}
}
r = min[0];
res.append(sb.charAt(r));
sb.deleteCharAt(r);
}
while (sb.length() > 0) {
res.append(sb.charAt(sb.length() - 1));
sb.deleteCharAt(sb.length() - 1);
}
return res.toString();
}
//res[0]是序号 res[1] 是字母
private int[] findMin(StringBuilder sb, int start, int length, int min) {
int[] res = new int[2];
res[0] = start;
res[1] = sb.charAt(start) - 'a';
for (int i = start; i < sb.length(); i++) {
if (sb.charAt(i) - 'a' < res[1]) {
res[1] = sb.charAt(i) - 'a';
res[0] = i;
if (res[1] == min) {
return res;
}
}
}
return res;
}
}
第一题连接如下-2432. 处理用时最长的那个任务的员工
2432. 处理用时最长的那个任务的员工
第二题连接如下-2433. 找出前缀异或的原始数组
2433. 找出前缀异或的原始数组
第四题连接如下-2435. 矩阵中和能被 K 整除的路径
2435. 矩阵中和能被 K 整除的路径
3.结束
第四题看了下解析,感觉还是不难的,看了一眼思路,自己敲能做出来。什么时候能ak啊!!!加油,上分!!!!gogogo,刷题刷题,每天一道,三年1000道!!!!