2021字节跳动5.30夏令营笔试编程题

目录

一、最小覆盖子串

题目

输入

输出

方法:滑动窗口

二、下象棋(待做)

题目

输入

输出

三、定制文化衫(待做)

扫描二维码关注公众号,回复: 13161601 查看本文章

题目

输入

输出


一、最小覆盖子串

题目

给定一个定长的字符串,其中包含若干字符,求该字符串中一个连续子串,满足两个条件:

1. 子串包含该字符串中的所有不同的字符

2. 满足条件1中最短的一个(若有多个,则找从左到右第一个出现的子串)

输出用子串的起始下标与长度来表示

输入

输入一个字符串(如abbbaaccb),字符串长度[ 1, 65535],字符集为单字节ascii码集合

输出

返回最短包含全集的子串,用(起始下标,长度)二元组表示。如果结果不唯一,返回第一个找到的结果。

上述例子中,候选有两个,即abb“baac”cb与abbba“accb”,返回第一个的子串,表示为( 3, 4)

方法:滑动窗口

import java.util.*;
import java.util.HashMap;


public class Solution {
    public String minWindow (String S, String T) {
        // write code here
        HashMap<Character,Integer> need = new HashMap<>();//目标字符需要的次数
        HashMap<Character,Integer> window = new HashMap<>();//窗口出现字符的次数

        for(int i = 0;i < T.length();i++){
            need.put(T.charAt(i),need.getOrDefault(T.charAt(i),0) + 1);//统计目标字符出现的次数
        }

        int left = 0,right = 0,flag = 0,minlen = Integer.MAX_VALUE,start = 0;
        while(right < S.length()){
            char c = S.charAt(right);
            right++;
            if(need.containsKey(c)){//当右滑元素包括目标字符时
                window.put(c,window.getOrDefault(c,0) + 1);//窗口的目标字符出现次数加1
                if(need.get(c) == window.get(c)){//如果该字符出现次数达到了目标次数
                    flag++;//增加字符成功的次数
                }
            }
            while(flag == need.size()){//如果所有字符都满足了条件,开始左滑
                if(right - left < minlen){//如果当前长度小于最小长度,记录当前的值
                    start = left;//开始下标
                    minlen = right - left;//最小长度
                }
                char d = S.charAt(left);//左滑
                left++;
                if(need.containsKey(d)){//如果当前左滑的元素为目标字符
                    if(need.get(d) == window.get(d)){//且次数刚好满足,则满足字符数量减1
                        flag--;
                    }
                    window.put(d,window.getOrDefault(d,0) - 1);//目标字符出现次数减1
                }
            }
        }
        return minlen == Integer.MAX_VALUE ? "" : S.substring(start,start + minlen);
    }
}

运行时间和空间消耗, 

二、下象棋(待做)

题目

小A和小B在下象棋,经过激烈的对局,两人都只剩下了将和一匹马。此时小A提议,如果小B能计算出在小A不移动棋子且小B的马只能朝右上方移动的情况下,小B的马从原点出发能够顺利取胜的路径数(吃掉小A的将,且在移动的过程中不被小A的马攻击),那么就算小B赢的对局。聪明的你能帮小B赢得对局吗?

马行动的规则:马走日,一直一斜。即马每次行动需进行两个步骤,首先向右或向上移动一格(一直),再沿原移动方向倾斜45度的对角线跳动一次(一斜)。例如,假设马的位置为( 0, 0),那么马行动一次可以移动到( 1, 2)或( 2, 1)。但是,马在直线移动后不能落在一个已有棋子的位置上,否则马将无法沿对角线跳跃。即,当马的位置在( 0, 0),且( 1, 0)位置有棋子时,马不能到达( 2, 1),但可到达( 1, 2)。

输入

输入四个整数,前两个数表示小A的马的坐标,后两个数表示小A的将的坐标

输出

输出一个整数,表示能够取胜的路径个数

三、定制文化衫(待做)

题目

某公司想在10月24日为每个人定制一件文化衫。文化衫有D、E、F三种款式,

D[i] 表示编号为 i 的员工收到 D 款式的文化衫时的快乐值,

E[i] 表示编号为 i 的员工收到 E 款式的文化衫时的快乐值,

F[i] 表示编号为 i 的员工收到 F 款式的文化衫时的快乐值,

没有人愿意和自己的直系领导撞衫,

求所有人收到文化衫时的快乐值总和的最大值,

输入

共有 2 N 行,

第 1 行是公司的总人数 N( 2 <= N <= 5000),

第 2 行到第 N + 1 行描述了员工的快乐值,第 i + 2 行是三个空格分隔的整数: D[i]( 0 <= D[i] <= 100)、 E[i]( 0 <= E[i] <= 100)、 F[i]( 0 <= F[i] <= 100) 表示编号为 i 的员工收到文化衫时的快乐值。最大的领导的编号为 0,

第 N + 2 行到第 2 N 行描述了公司的上下级关系,每行有两个空格分隔的整数:A 和 B,表示 A 是 B 直系领导。除大领导之外,每个员工有且只有一个直系领导。

输出

一个整数,快乐值总和的最大值。

猜你喜欢

转载自blog.csdn.net/weixin_39478524/article/details/117707875
今日推荐