Shopee使用的是ACM赛制,但是数据要求确实LeetCode格式,所以处理数据的输入和输出比较麻烦,最后我选择了使用python来解题。
简单总结来说就是,写题3分钟,调格式1小时。
第一题:
简单的dp问题,从左上角走到右下角,每次只能向右或者向下走,求最小花费,状态转移方程为:dp[i][j] = min(dp[i - 1][j], dp[i][j - 1])
,把第一行和第一列进行初始化,防止进行越界判断的复杂处理。
raw = input()[1:-1].split("],")
raw[len(raw) - 1] = raw[len(raw) - 1][0:-1]
l = []
for s in raw:
l.append(s[1:].split(','))
n, m = len(l), len(l[0])
for i in range(0, n):
for j in range(0, m):
l[i][j] = int(l[i][j])
for i in range(1, n):
l[i][0] += int(l[i - 1][0])
for j in range(1, m):
l[0][j] += int(l[0][j - 1])
for i in range(1, n):
for j in range(1, m):
l[i][j] += min(l[i - 1][j], l[i][j - 1])
print(l[n - 1][m - 1])
第二题:
版本号比较,把字符串按点号分割成数字,然后遍历即可。
num = input().split(',')
v1, v2 = num[0].strip()[1:-1], num[1].strip()[1:-1]
num1, num2 = v1.split('.'), v2.split('.')
flag = 0
for i in range(max(len(num1), len(num2))):
s1 = int(num1[i]) if i < len(num1) else 0
s2 = int(num2[i]) if i < len(num2) else 0
if s1 > s2:
flag = 1
break
elif s1 < s2:
flag = -1
break
print(flag)
第三题:
简单的二叉树层序遍历,因为给了二叉树的数组表示,那么我们直接利用第i
个元素的子元素是i*2
和i*2+1
,模拟一遍即可完成。
tree = input()[1: -1].split(',')
tree.insert(0, 0)
l = []
q = [1]
while len(q) != 0:
size = len(q)
tmp = []
for i in range(size):
idx = q.pop(0)
tmp.append(int(tree[idx]))
if idx * 2 < len(tree) and tree[idx * 2] != '#':
q.append(idx * 2)
if idx * 2 + 1 < len(tree) and tree[idx * 2 + 1] != '#':
q.append(idx * 2 + 1)
l.append(tmp)
ans = "["
for i in range(len(l)):
ans += '['
for j in range(len(l[i])):
ans += str(l[i][j])
if j != len(l[i]) - 1:
ans += ','
ans += "]"
if i != len(l) - 1:
ans += ','
ans += "]"
print(ans)