美团算法综合8.15:1,0.5,1,0.18

四道题目分别是1,0.5,1,0.18,求解2,4解顺便贴出自己的代码。
1,四倍回文,如果一个数字的四倍和自己的回文相同那就是我们要找的回文,求1~n范围有多少这样的回文,数据是10^7除4之后是10^6,直接暴力。
def f1(n):
    r = []
    c = n // 4
    for i in range(1, c + 1):
        if str(4*i) == str(i)[::-1]:
            r.append(i)
    return r

while True:
    try:
        n = int(input())
        r = f(n)
        print(len(r))
        for i in r:
            print(str(i), ' ', str(i)[::-1])
    except:
        break

2,给一个车票记录的列表,列表的每个元素是做过的一趟车的起点和终点,如果一次出行完整的从车票起点走到了终点那就算做一次旅行,求总共有多少次旅行,0.55渣渣求解答0.55的渣渣明白了,如果一趟旅行的起点和终点是一样的那也算一次旅行,就是坐车从北京到北京也算,原地TP。。。
def f2(ts):
    if len(ts) == 1:
        u, v = ts[0][0], ts[0][1]
        if u == v:
            return 1
        elif u != v:
            return 0
    res = 0
    curr, last = '', ''
    for t in ts:
        u, v = t
        if curr == '' and last == '':
            curr, last = u, v
        elif curr == v and last == u:
            res += 1
            curr, last = '', ''
        elif last == u and curr != v:
            last = v
    return res

while True:
    try:
        n = int(input())
        ts = []
        for _ in range(n):
            temp = input().split()
            ts.append(temp)
        print(f(ts))
    except:
        break

3,并查集解决,模板直接套,具体题目的描述记不清了,反正只要熟练掌握并查集就可以做。
import collections

def f3(hs, n):
    roots = {}
    res = collections.defaultdict(set)
    def findroot(node):
        nonlocal roots
        if node not in roots:
            roots[node] = node
        elif roots[roots[node]] != roots[node]:
            roots[node] = findroot(roots[node])
        return roots[node]
    
    for h in hs:
        u, v = h
        
        if u not in roots:
            roots[u] = findroot(v)
        elif v not in roots:
            roots[v] = findroot(u)
        else:
            roots[findroot(u)] = findroot(v)
    
    for i in range(1, n + 1):
        curr = findroot(i)
        res[curr].add(i)
    ks = []
    
    for k in res:
        ks.append(sorted(res[k]))
    ks.sort(key = lambda k: k[0])
    return ks

while True:
    try:
        n, m = list(map(int, input().split()))
        hs = []
        for _ in range(m):
            temp = list(map(int, input().split()))
            hs.append(temp)
        ks = f(hs, n)
        print(len(ks))
        for k in ks:
            print(' '.join(map(str, k)))
    except:
        break

4,最后一道也是最难的一题,有n辆车和ab两个城市,a、b两个城市分别需要a、b辆车(a + b < n),然后给出n辆车每辆去往a城市或者b城市的收益,求合满足ab城市调度需求下能得到的最大收益,想的是通过dp(i,j,k)代表k辆车已经使用同时ab两地分别已经有i、j辆车的情况下得到的最大收益,但是三维动态规划没法得到解,求指点:
def f4(ps, a, b, n):
    dp = [[[0] * (n + 1) for _ in range(b + 1)] for _ in range(a + 1)]
    for i in range(a):
        for j in range(b):
            for k in range(n):
                if i == a:
                    dp[i + 1][j + 1][k + 1] = max(dp[i + 1][j][k] + ps[k][1], dp[i][j][k])
                if j == b:
                    dp[i + 1][j + 1][k + 1] = max(dp[i][j + 1][k] + ps[k][0], dp[i][j][k])
                else:
                    dp[i + 1][j + 1][k + 1] = max(dp[i][j][k],dp[i][j + 1][k] + ps[k][0], dp[i + 1][j][k] + ps[k][1])
    print(dp)
    return dp[-1][-1][-1]
情急之下直接深搜一波,加上lru缓存过了0.18,估计是11个测试用例的2个吧
import functools

def f(ps, a, b, n):
    res = 0 
        @functools.lru_cache def dfs(i, j, tmp, cur):
        nonlocal res, ps
        if i == 0 and j == 0:
            res = max(res, tmp)
            return
        if cur == len(ps):
            return
        if i == 0:
            dfs(i, j - 1, tmp + ps[cur][1], cur + 1)
            dfs(i, j, tmp, cur + 1)
        if j == 0:
            dfs(i - 1, j, tmp + ps[cur][0], cur + 1)
            dfs(i, j, tmp, cur + 1)
        else:
            dfs(i - 1, j, tmp + ps[cur][0], cur + 1)
            dfs(i, j - 1, tmp + ps[cur][1], cur + 1)
            dfs(i, j, tmp, cur + 1)
        
    dfs(a, b, 0, 0)
    return res

2,4求解答!!!

#美团笔试##笔试题目##美团#
全部评论
老哥本地测试用什么ide
1 回复 分享
发布于 2020-08-15 20:08
内阁大佬,第一个n//4是啥意思😂
1 回复 分享
发布于 2020-08-15 18:26
哥,美团的笔试系统多久才能进去啊
点赞 回复 分享
发布于 2020-08-22 15:39
大佬
点赞 回复 分享
发布于 2020-08-15 20:54
博主为啥调用的函数是  f()  ,命名的函数是 f1()  f2() f3()呀?python能这样吗?
点赞 回复 分享
发布于 2020-08-15 19:57
想问一下这个美团的成绩是按照最高分吗? 不是按照最后交卷的分数吧?
点赞 回复 分享
发布于 2020-08-15 19:15
第一题是暴力不超时?我TM……早知道试一下了
点赞 回复 分享
发布于 2020-08-15 18:24
第三题res不就是按顺序放的吗,为啥不直接返回
点赞 回复 分享
发布于 2020-08-15 18:23
第四题也没做出来,但感觉是:dp[i][j] = Math.max(dp[i - 1][j] + 现存A地最大的利润, dp[i][j - 1] + 现存B地最大的利润)。。。如果有多个现存最大的话,选择另外一地利润最小的那个
点赞 回复 分享
发布于 2020-08-15 18:17
第二题直接一个Set就可以呀。。。咋这么麻烦
点赞 回复 分享
发布于 2020-08-15 18:14
题目都是啥来着?有大佬知道吗
点赞 回复 分享
发布于 2020-08-15 18:13
第二题考虑 A - A是一次旅行了吗,考虑了的话,就全ac了
点赞 回复 分享
发布于 2020-08-15 18:12

相关推荐

点赞 评论 收藏
分享
上周组里招人,我面了六个候选人,回来跟同事吃饭的时候聊起一个让我挺感慨的现象。前三个候选人,算法题写得都不错。第一道二分查找,五分钟之内给出解法,边界条件也处理得干净。第二道动态规划,状态转移方程写对了,空间复杂度也优化了一版。我翻他们的简历,力扣刷题量都在300以上。后三个呢,就有点参差不齐了。有的边界条件没处理好,有的直接说这道题没刷过能不能换个思路讲讲。其中有一个女生,我印象特别深——她拿到题之后没有马上写,而是先问我:“面试官,我能先跟你确认一下我对题目的理解吗?”然后她把自己的思路讲了一遍,虽然最后代码写得不是最优解,但整个沟通过程非常顺畅。这个女生的代码不是最优的,但当我问她“如果这里是线上环境,你会怎么设计’的时候,她给我讲了一套完整的方案——异常怎么处理、日志怎么打、怎么平滑发布。她对这是之前在实习的时候踩过的坑。”我在想LeetCode到底在筛选什么?我自己的经历可能有点代表性。我当年校招的时候,也是刷了三百多道题才敢去面试。那时候大家都刷,你不刷就过不了笔试关。后来工作了,前三年基本没再打开过力扣。真正干活的时候,没人让你写反转链表,也没人让你手撕红黑树。更多的是:这个接口为什么慢了、那个服务为什么OOM了、线上数据对不上了得排查一下。所以后来我当面试官,慢慢调整了自己的评判标准。算法题我还会出,但目的变了。我出算法题,不是想看你能不能背出最优解。而是想看你拿到一个陌生问题的时候,是怎么思考的。你会先理清题意吗?你会主动问边界条件吗?你想不出来的时候会怎么办?你写出来的代码,变量命名乱不乱、结构清不清楚?这些才是工作中真正用得到的能力。LeetCode是一个工具,不是目的。它帮你熟悉数据结构和常见算法思路,这没问题。但如果你刷了三百道题,却说不清楚自己的项目解决了什么问题、遇到了什么困难、你是怎么解决的,那这三百道题可能真的白刷了。所以还要不要刷LeetCode?要刷,但别只刷题。刷题的时候,多问自己几个为什么:为什么用这个数据结构?为什么这个解法比那个好?如果换个条件,解法还成立吗?把刷题当成锻炼思维的方式,而不是背答案的任务。毕竟面试官想看到的,从来不是一台背题机器,而是一个能解决问题的人。
国企上岸了的向宇同桌...:最害怕答非所问了,但是频繁反问确定意思又害怕面试官觉得我笨
AI时代还有必要刷lee...
点赞 评论 收藏
分享
评论
3
17
分享

创作者周榜

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