字节夏令营530 软件工程 AC

1、给定字符串S,找出包含S所有字符的最短字串。
思路:滑动窗口,先往右滑,满足条件后立刻收缩。
static void zj1(String s) {
        Map<Character, Integer> map = new HashMap<>();
        for (char c : s.toCharArray()) {
            map.put((c), map.getOrDefault(c, 0) + 1);
        }

        Map<Character, Integer> newMap = new HashMap<>();
        int[] ans = new int[]{0, s.length() - 1};
        int l = 0;
        for (int i = 0; i < s.length(); i++) {
            char cur = s.charAt(i);
            newMap.put(cur, newMap.getOrDefault(cur, 0) + 1);
            while (newMap.size() >= map.size()) {
                if (i - l < ans[1] - ans[0]) {
                    ans = new int[]{l, i};
                }
                char cl = s.charAt(l);
                int cnt = newMap.get(cl);
                if (cnt <= 1) {
                    newMap.remove(cl);
                } else {
                    newMap.put(cl, cnt - 1);
                }
                l++;
            }
        }
        System.out.println(ans[0] + "," + (ans[1] - ans[0] + 1));
    }

2、下象棋,双方只有1马,1将,你的马在原点,给定对方的马和将的位置,问有几种方法可以将军,同时不被对方攻击(只能向右上方走)。
思路:一开始看到的时候比较慌,后来做出来后发现还可以。
dp[i][j]表示走法,dp[i][j] = dp[i-1][[j-2] + dp[i-2][j-1]; 但是有些地方是没法转移的,1是对方马能攻击的范围,2是对方马的左下角。
static void main(){
        int[] ints = Arrays.stream(scanner.nextLine().split(" ")).mapToInt(Integer::valueOf).toArray();
        int x = ints[0], y = ints[1];
        int[][] baned = new int[][]{{x - 1, y - 2}, {x + 1, y + 2}, {x - 2, y - 1}, {x + 2, y + 1},
                {x + 1, y -2}, {x + 2, y - 1}, {x - 1, y + 2}, {x - 2, y + 1}, {x + 1, y+ 1}};
        zjmemo[0][0] = 1L;
        zjmemo[x][y] = 0L;
        System.out.println(zj2(ints[2], ints[3], x, y, baned));
}

static long zj2(int i, int j, int f, int g, int[][] baned) {
        if (i < 0 || j < 0) {
            return 0;
        }
        for (int[] b : baned) {
            if (i == b[0] && j == b[1]) {
                return 0;
            }
        }
        if (zjmemo[i][j] != null) {
            return zjmemo[i][j];
        }
//        if (i - 1 == f && j - 1 == g) {
//            return 0;
//        }
        zjmemo[i][j] = 0L;
        for (int[] dir : dirs) {
            int x = i + dir[0], y = j + dir[1];
            zjmemo[i][j] += zj2(x, y, f, g, baned);
        }
        return zjmemo[i][j];

    }
3、公司举办派对,有a,b,c三种衣服,int[][3] happy表示每个人穿不同衣服能获得的快乐值,f[][2] 表示每个人的直属上级,每个人不会跟直属上级穿同样的衣服,问能获得的最大快乐值是多少。
思路:树形dp, dp[i][j] 表示 第i人穿j衣服能获得的最大值,dp[i][j] = max(下属1穿j+1的快乐值,下属1穿j+2的快乐值) + max(下属2穿j+1的快乐值,下属2穿j+2的快乐值) + ........;
所以我们返回max(dp[boss][0], dp[boss][1], dp[boss][2]);
这里求boss可以使用并查集的思路,或者入度。我是用的并查集。
static long zj2(int i, int t, List<List<Integer>> children, int[][] happy) {
        if (zjmemo[i][t] != null) {
            return zjmemo[i][t];
        }

        zjmemo[i][t] = happy[i][t];
        for (Integer integer : children.get(i)) {
            zjmemo[i][t] += Math.max(zj2(integer, (t + 1) % 3, children, happy), zj2(integer, (t + 2) % 3, children, happy));
        }

        return zjmemo[i][t];
    }


#学习路径#
全部评论
我计算机软件工程方向,题目跟你一样!
点赞 回复 分享
发布于 2021-05-30 21:35
第一题有lc原题吗?
点赞 回复 分享
发布于 2021-05-30 21:13

相关推荐

刷到过很多实习生和mentor处成哥们儿的帖子,看完大概率会羡慕这种亲近的上下级关系。但我想说,不管你跟带教的关系有多铁或者多僵,都得拎清课题分离这事儿,工作的边界感千万不能乱踩!📝&nbsp;下面这几条雷区,实习生们可千万别踩!1.别越级瞎提建议除非带教主动问你想法,否则别愣头愣脑地凑上去说&nbsp;“我觉得你应该咋样咋样”。咱就管好自己那一亩三分地,把本职工作干明白就够了,别瞎操心不属于自己的事儿。2.别卖队友换好感❌那种把实习生之间的小秘密捅出去,就为了换带教或者同事认可的操作,纯纯是作死。尤其是那些会影响到别人的话,比如&nbsp;“她就是嫌通勤远才请假”“他们偷偷建了个小群吐槽”,这话一出口,不仅把同事的信任踩碎了,自己还得惹一身麻烦。3.别养成反驳甩锅的臭毛病📗犯了错第一反应别是找借口、甩锅,那没啥用。不如沉下心复盘问题出在哪儿,琢磨个解决方案出来,保证下次不再掉坑里,这才是正经事。4.别瞎掺和正职的八卦我之前实习的组氛围贼好,正职们经常聊对象、聊恋爱进展啥的。但人家正职能聊,不代表咱实习生能跟着掺和。乖乖当个安静的吃瓜群众,竖起耳朵听着就行,别瞎插嘴,当个小透明准没错👂4.别随便评价别人的人品背后嚼舌根说别人咋样咋样,很容易让人觉得你没分寸。你聊啥,别人就可能觉得你认同啥,职场里保持中立,少议论人,才是最稳的。
omega@1112:唯一的大雷其实是不要问mentor的薪资待遇
mt对你说过最有启发的一...
点赞 评论 收藏
分享
评论
1
15
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务