美团笔试题2021.8.29
又再帮同学写,推了这周的周赛,侥幸都有点思路
丁香树
题目描述
思路
因为芳香值最大为30,所以用一个数组存储已走过的芳香值,然后走到第i个点,找比当前芳香值小的有多少个,加上就行了
书架整理
题目描述
思路
贪心
将书架和书都排序,然后从后向前匹配,找书能放的最大的书架,例子中,就是大小为4的书能放在2个书架(4 4)中,就是两种情况;此时放了一本书,剩下书架3个,就放第二大的书,第二大的书能放在两个书架中(3 4),也是两种情况;以此类推,就是222 = 8
优化:找书架的时候用二分更快,不用我感觉也行,因为10的5次,复杂度nlogn肯定不会超时,但是赛马牛客不是力扣,范围很迷,可能不用就过不了最后一个例子
文件流
题目描述
思路
双指针
相当于匹配字符串的子序列,如果字符相同,那么就向后移动,否则只移动s的指针
如果不够了,再补一个字符串s
最极端的用例复杂度是10的8次,有超时风险,同学交了也没都通过,应该是超时了
优化:我想了一下,如何减少遍历次数呢,那就是用map集合,先把原来s字符串中的字符都放在一个map集合中,键是字符,值是下标;然后依次判断a中的字符,如果第下一个字符出现的位置(在map中直接O1的找)比当前字符出现的位置靠后,那么就说明在一个s中可以找到;如果靠前,那么就需要拼接下一个s;直到找到最后一个
割草机
题目描述
思路
这个题有点难,刚开始我还以为就是一个让求圆里面正方形个数的题,后面发现每次是把当前草地的草都割掉,
首先注意到,不用去考虑边界问题,因为给出的r都能保证形成一个完整的圆
刚开始我是通过找规律,当半径为0的时候,可以割掉的点就1个,也就是圆心所在位置
当半径为1的时候,可以割掉的点有5个;
半径为2的时候,可以割掉的点有13个
这个规律可以清晰的看到了,就是当半径为r时,割掉的点就有1 + 2^2 + 2^3 + … + 2 ^ (r + 1)
但是这个并不能说明什么,因为还需要记录每次割掉的点是哪个,所以感觉只能暴力写了,
用一个二维数组存储每个位置草的情况,遍历时间,通过圆心和半径找到当前能割掉的点,然后再给点长草,暴力听说能过30多。。而且要创建两个维度均为10^5的二维数组,肯定超空间了
这就说明肯定不是暴力做的
再想想,可以从后往前?最后一天割的地,前面就不用处理了,…
附加题:输入框回文测试
测试岗的附加题,写测试用例的题