美团8.13笔试,python
都没有AC😭😭😭
一直没有系统的学习python,一些东西用的不好😭😭😭
写得好烂,只想记录和跟大家讨论一下。
1. 送外卖
n, t = map(int, input().split()) tmp = list(map(int, input().split())) tmp.sort() # 用一个变量记录当前时间,一个记录使用魔法次数 current_t, count = 0, 0 for i in range(n): if current_t + t > tmp[i]: count += 1 else: current_t += t print(count)
tmp里面表示订单的最晚送达时间,为了防止不是从小到大排序的首先需要排序。
后面的逻辑就比较简单,如果 当前时间 + 运输时间 > 最晚送达时间 就使用魔法,否则正常运送给同时更新当前时间。
2. 扫地机器人
import numpy as np # 提取数据 x, y, step = map(int, input().split()) dem = list(map(str, input())) arr = np.zeros((x, y)) arr[0, 0] = 1 # 记录 x1, y1, remain = 0, 0, 0 total = x * y for i in range(step): if dem[i] == 'W': x1 -= 1 elif dem[i] == 'A': y1 += 1 elif dem[i] == 'S': x1 += 1 else: y1 -= 1 arr[x1, y1] = 1 remain = total - arr.sum() if remain == 0: print('Yes') print(i+1) break if remain > 0: print('No') print(int(remain))
用两个变量记录当前位置,一个变量记录剩余数目。(感觉那个二维数组挺占内存的?)
逻辑比较简单,每次获取往哪边走更新坐标然后记录就行。
3. 扑克牌
n = int(input()) pai = list(map(int, input().split())) # 从后面开始往前拿牌 result = [pai[-1]] for i in range(n-2, -1, -1): result.insert(0, pai[i]) for j in range(2): temp = result[-1] result[1:] = result[:-1] result[0] = temp print(result)
首先先执行两次从牌顶抽牌放到牌底的动作(洗牌),再执行开牌动作。
可以把从牌顶开牌理解成从牌顶拿走这张牌。
反过来想,先知道了开牌的顺序还原原来的顺序,那就把之前的动作反过来执行,先开牌后执行两次洗牌动作。
[1,2,3,4] 从后往前取,执行两次洗牌动作(从牌底拿牌放到牌顶) 1. [4] → [4] → [4] 2. [3,4] → [4,3] → [3,4] 3. [2,3,4] → [4,2,3] → [3,4,2] 4. [1,3,4,2] → [2,1,3,4] → [4,2,1,3] [4,2,1,3]
4. 三元组
n = int(input()) a = list(map(int, input().split())) count = 0 a_num = [a[i] for i in range(n-2)] for j in range(1, n): for k in range(j+1, n): sum_ = 3 * a[j] - a[k] if sum_ in a_num: count += 1 print(count)
唉,我做的时候只想到了3个循环,看了别人的贴子之后才知道这种方法。
只要想用一个数组存在a[i],然后再循环j,k,判断计算后的结果是否在数组中存在,存在则+1。
这种只需要两个循环,复杂度更低了。