拼多多笔试

题目描述
给定正整数N,你的任务是用最少的操作次数把1,2,3…N中所有数都变为0。
每次操作可从序列中选任意个整数,同时减去一个相同的正整数。
例如:1,2,3可以同时把后两个减去2,得到1,0,1,然后再选第一个和第三个,同时减去1即可

解法:
当n=3时,对数列1,2,3,把2和3同时减去2得到1,0,1,然后再选第一个和第三个,同时减去1即可。类似的,比如当n=7时,对数列1,2,3,4,5,6,7,把4,5,6,7同时减去4得到1,2,3,0,1,2,3,此时问题等价于n=3时的情况。令f(n)表示最少操作的次数,则有f(1)=1,f(2)=2,f(3)=2,f(4)=3,f(5)=3,f(6)=3,f(7)=3,f(8)=4,f(9)=4…通过以上规律可知,当2 ^ (m-1) ≤ n < 2^m 时,f(n)=m

num = int(input())
cnt = 0
while num > 0:
    cnt += 1
    num = num // 2
print(cnt)

题目描述
摞箱子。第 i 个箱子可以放入第 j 个箱子要求:(1)第 j 个箱子为空(2)第 i 个箱子未放入其他箱子 (3)第 i 个箱子的边长小于第 j 个箱子。箱子为正方形,求可见的箱子的最小数
样例一:
输入:
第一行:箱子总数
第二行:每个箱子的边长
5
3 2 4 1 4
输出:
2

解法:
最开始笔试的时候我选择用类似链表的方法,如

4 - 3 - 2 - 1
4

使用 defaultdict 很容易就实现,但是后台数据有5%过大运行超时。后来,仔细一想,这道题和第一题其实一样,是个巧法题——只要找到某个数的最多重复次数就可以了

from collections import Counter
n = int(input())
l = list(map(int, input().split()))
counter = Counter(l)
a, b = counter.most_common()[0]
print(b)

题目描述
同LeetCode 407 - 接雨水II
样例一
输入:
5 5
1 3 1 2 1
2 1 3 1 1
1 4 2 6 1
1 3 1 3 1
1 1 5 1 1
输入:
4

解法:
2-D的接雨水问题的边界不再是线段的两个端点,而是矩形的一周,所以我们用优先队列维护所有边界点,收缩时,也不仅仅只有左右两个方向,而是上下左右四个方向,并且维护一个visit的数组,记录哪些坐标已经被访问过,不然会造成重复求解。

import heapq
def rain(g):
    if not g: return 0
    q = []
    row = len(g)
    col = len(g[0])
    if row < 3 or col < 3: return 0
    visited = [[False] * col for _ in range(row)]
    for i in range(row):
        heapq.heappush(q, (g[i][0], (i, 0)))
        visited[i][0] = True
        heapq.heappush(q, (g[i][col -1], (i, col -1)))
        visited[i][col - 1] = True
    for j in range(1, col - 1):
        heapq.heappush(q, (g[0][j], (0, j)))
        visited[0][j] = True
        heapq.heappush(q, (g[row - 1][j], (row - 1, j)))
        visited[row - 1][j] = True
    d = [[0, 1],[0, -1],[1, 0],[-1, 0]]
    ans = 0
    while q:
        h, (x, y) = heapq.heappop(q)
        for i in range(4):
            newx = x + d[i][0]
            newy = y + d[i][1]
            if 0 <= newx < row and 0 <= newy <col and visited[newx][newy] == False:
                newh = g[newx][newy]
                if newh < h:
                    ans += h- newh
                    g[newx][newy] = h
                heapq.heappush(q, (g[newx][newy], (newx, newy)))
                visited[newx][newy] = True 
    return ans

n,  m = map(int, input().split())
g = []
for _ in range(n):
    tmp = list(map(int, input().split()))
    g.append(tmp)
ans = rain(g)
print(ans)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值