Cho ma trận 2D đại diện spreadsheet Excel. Mỗi ô chứa giá trị, tham chiếu ô khác, hoặc công thức (ví dụ: =A1+A2, =2+5). Tính toán tất cả ô và công thức, trả về ma trận kết quả.
Ví dụ: Input [["B1","7","0"],["3","5","=A1+A2"]] → Output [["7","7","0"],["3","5","10"]].
Giải pháp: Đệ quy với memoization. Hàm resolve(s) xử lý chuỗi: nếu là số → trả về int; nếu là tham chiếu (VD: "B1") → chuyển tọa độ và gọi solve; nếu là công thức (bắt đầu "=") → tách toán hạng và toán tử, đệ quy tính toán.
Ví dụ triển khai
class Solution:
def solve(self, matrix):
def resolve(s):
try:
return int(s)
except:
return solve(*getIdx(s))
def getIdx(s):
return [int(s[1:]) - 1, ord(s[0]) - ord("A")]
def do(a, b, op):
if op == "+": return a + b
if op == "-": return a - b
if op == "*": return a * b
if op == "/": return a / b
def solve(i, j):
try:
return int(matrix[i][j])
except:
s = matrix[i][j]
if s[0] == "=":
for c in s[2:]:
if c in "+-/*":
op = c
break
a, b = s[1:].split(op)
aRes, bRes = resolve(a), resolve(b)
return do(aRes, bRes, op)
else:
return solve(*getIdx(s))
for i in range(len(matrix)):
for j in range(len(matrix[0])):
matrix[i][j] = str(solve(i, j))
return matrix
ob = Solution()
matrix = [["B1","7","0"],["3","5","=A1+A2"]]
print(ob.solve(matrix))
Đầu vào
[["B1","7","0"],["3","5","=A1+A2"]]
Đầu ra
[['7','7','0'],['3','5','10']]