笔试 | 字节跳动2021秋招第一场笔试题目&讲解

今天为大家带来的是2020秋招字节跳动第一场笔试的四个编程题。这里只为大家列出了思路和解法,更多的题目和实现代码欢迎关注公众号“面鲸”,加入刷题群&面试交流群。也祝大家明天笔试顺利!

第一题

某天你得到了一个长度为n(1<=n<=500000)的字符串,并且这个字符串只包含小写字母。现在允许你修改m(1<=m<=n)个位置的字母,修改完毕你要选取这个字符串的一个连续子串,如果这个子串只包含一种字母,那么这个连续子串是一个完美字符串。你希望得到的完美字符串长度尽可能长,请计算出你所能得到的最长长度是多少。

样例输入

  • 8 1

  • aabaabaa

样例输出

  • 5(把任意一个b换成a,得到的最长完美字符串为aaaaa)

样例输入

  • 8 2

  • aabaabaa

样例输出

  • 8 (把两个b都换成a,得到最长完美子串为aaaaaaaa)

思路

  • 这个题要求的是最后能得到的最长的完美子串的长度是多少,这个完美子串是由「同一个字符」构成的。那么可以枚举下最后最长的这个完美子串是由哪个字母组成的。

  • 那么问题就转换成了「如何求只包含某一个字符的最长的完美串」。解决这个问题之后可以遍历26个字母中的每一个,然后就能得到最终的答案了。

  • 以字母'a'为例。这个子问题是一个典型的利用two pointers来解决的问题。设置两指针left和right,分别表示当前考虑的子串的起点和终点坐标。每次我们尝试移动right指针,如果right指针所指向的字符不是'a',那么我们可以用一个替换操作把它换成'a';换完之后如果替换的机会已经用完了,那么就需要得把左边的指针往右边移动,直到替换的次数不超过m个。这个时候,left和right所指向的子串就是一个满足要求的。

  • 拿第一个样例举例来看。最开始left=right=0,固定left让right持续往右走,直到遇到第一个b(下标为2),这个时候我们可以用一次替换的操作把这个b换成a。然后可以继续往前走,直到遇到第二个b,尝试去把第二个b换成a,换完之后发现替换操作我们用了两次,所以就让left指针尝试往右走,将多余的那次操作给抹掉,当left=2的时候,使用的操作数减1,我们就又得到了一个符合条件的完美串。继续往下执行即可。。也就是说,当right到达下一个位置的时候,判断当前修改次数是否满足要求,如果满足要求那么更新答案;否则往前移动left指针,直到修改次数满足要求。

  • 时间复杂度,O(n * 26)

第二题 最优连续子序列

给定一个长度为n的整数序列,找出其中的一段连续子序列,使得该段连续子序列的交替和最大。序列的交替和为

输入描述

  • 输入的第一行为一个正整数n(n<=1e5),表示序列的长度

  • 输入的第二行为n个整数,依次给出了。(-10^5<=<=10^5)

输出描述

  • 输出一个整数,表示最大的交替和

样例输入

  • 5

  • 1 2 3 4 5

样例输出

  • 5

样例输入

  • 5

  • 1 -2 3 -4 5

样例输出

  • 15

分析

  • 对于某一个元素来说,它出现在交替子段和中的时候,它前面的符号可以是正的也可以是负的。那其实就可以把这个数组搞成连个数组,一个数组中是正的,另外一个数组中是负的。

  • 所以问题可以转化为求两个数组的最大子段和问题。第一个数组是,第二个数组是。但是我们得注意到题目中要求的是最大交替和的序列,第一项前面的系数是****。所以如果直接套用最大子段和求解的话会有问题。

  • 因此我们考虑将上面得到的两个数组做反转,分别得到和数组。然后对于两个数组求最大子段和,并且要求考虑更新最大值的时候位置前面的系数需为,这样映射回原数组的话就能保证和最大的那个子数组的开始元素前面的系数为正。

第三题 多米诺骨牌

小高最近迷上了玩多米诺骨牌:沿直线将一长串排摆放起来,推倒一个引起连锁反应,非常有趣。现在有n块牌,每张牌都有各自的高度和宽度(分别记为和)。小高的摆放规则是,后面的牌的高度和宽度必须都大于前面的牌,请问小高用这n张牌最多能选出多少张组成一个最长牌阵呢?

输入描述

  • 第一行一个整数n

  • 接下来n行,每行两个整数和。(所有牌中没有长度相同或者宽度相同的两张牌)

输出描述

  • 一个数x,表示最多能选出x张组成最长牌阵

样例输入

  • 5

  • 5 5

  • 3 1

  • 2 6

  • 4 2

  • 1 4

样例输出

  • 3

分析

  • 两个牌能放到一起当且仅当后面的牌的高度和宽度必须都大于前面的牌。如果我们将所有的牌按照宽度排序的话,那我们只需要找高度的最长上升子序列就可以了。所以这就是一个最长上升子序列的变种问题,可以说是送分的题啦。

  • 最长上升子序列是一个经典的问题,一般的解法有两种,一种是动态规划解法,复杂度是O(n^2)的;另外一种是基于二分查找的,复杂度是O(nlogn)。这里只给出了第一种解法,第二种可以自己摸索摸索~

第四题 生产调度

工厂中有N台机器,每台机器由于产出的时间不同,其生产能力也不一样。有一天,工厂接到了任务要生产N个产品。请你计算出一共有多少种生产方案。(每台机器生产一个产品,问有多少种匹配方式)。

输入描述

  • 输入的第一行为一个正整数N(N<=1e5),给出了机器的数量(即所需生产的产品数)

  • 输入的第二行为N个正整数,第i个整数代表着机器i的生产能力(只能生产型号<=)的产品,<=1e9

  • 输入的第三行为N个正整数,第个整数代表着产品i的型号,

  • 输入的第四行有一个整数P(P<=1e9)

输出描述

输出一个整数,为生产方案数 % P的结果。

样例输入

  • 3

  • 1 2 3

  • 1 2 3

  • 100

样例输出

  • 1

样例输入

  • 3

  • 3 3 3

  • 1 1 1

  • 100

样例输出

  • 6

分析

  • 因为最后要生产N种产品,而每个机器生产能力不同。因此我们优先考虑生产能力低的机器,快速找出当前机器能生产产品的总数。将机器能力和产品型号从小到大排序,枚举每个机器的同时二分找出能生产型号的数量,对与每个机器要减去之前机器生产过的数量,最后每个机器能生产的数量连乘。时间复杂的O(nlogn)。


面鲸,专注于互联网招聘笔试面试经验等的分享,希望在你找工作的过程中我们能够提供一些帮助。

笔试 | 字节跳动2021秋招第一场笔试题目&讲解_第1张图片

 

你可能感兴趣的:(笔试题解,算法,数据结构,字节跳动)