[杨小白]_leetcode_力扣第 314 场周赛-力扣-第三题

164 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第16天,点击查看活动详情

前言

小白算法比较菜,希望能激励我每日更新,从leetcode第一题开始,2022年目标300题,记录从0到1的全过程!!

力扣第 314 场周赛-力扣

力扣第 314 场周赛-力扣

真是坐牢,a了两题,第三题一直超时,结果排名还是1285,比之前三题的时候排名都高。看来这次确实有点难。

后来发现第三题,我一直把stringbuffer和stringbuilder记反了!!提交的时候用的stringbuffer,换一下就可以过了。。。。虽然也就只能上升个一两百的排名吧,1050左右。唉 又没上成分

image.png

第88双周赛的排名 image.png

第313周赛的排名

image.png

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 <= 105
  • s 只包含小写英文字母。

代码

这次挺无语的是,一直把stringbuilder和stringbuffer记反了。导致,超时没过。之前确实一直都没分清楚,相信这是一个深刻的教训,以后不会分不清了。

这个题的思路其实很简单,类似于栈吧,不过有两个栈,一个是s,一个是t.

这里分析一个例子

结合代码看,其实很容易看懂0.0

真是太服了我自己了,写了就就有机会进前1000啊,唉

例1

"aabcdabcd" ===>"aaabcdcbd"

image.png

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道!!!!