Giả sử chúng ta có một ma trận 2D biểu diễn một bảng tính excel. Chúng ta phải tìm cùng một ma trận với tất cả các ô và công thức được tính toán. Một bảng tính excel trông giống như bên dưới
B1 | 7 | 0 |
3 | 5 | =A1 + A2 |
Các cột được đặt tên là (A, B, C ...) và các hàng là (1, 2, 3 ...) Mỗi ô sẽ chứa một giá trị, một tham chiếu đến một ô khác hoặc một công thức excel cho một phép toán với giữa tham chiếu ô số hoặc ô. (Ví dụ. "=A1 + 5", "=A2 + B2" hoặc "=2 + 5")
Vì vậy, nếu đầu vào giống như
B1 | 7 | 0 |
3 | 5 | =A1 + A2 |
thì đầu ra sẽ là
7 | 7 | 0 |
3 | 5 | 10 |
như B1 =7 (Cột thứ hai hàng đầu tiên) và "=A1 + A2" là 7 + 3 =10.
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau
-
Xác định một hàm giải quyết (). Điều này sẽ mất s
-
nếu s là số, thì trả về s dưới dạng số nguyên
-
nếu không thì trả về giải quyết (getIdx (s))
-
Định nghĩa một hàm getIdx (). Điều này sẽ mất s
-
trả về một danh sách trong đó giá trị đầu tiên là chuỗi con của s từ 1 đến cuối là số nguyên và giá trị thứ hai là ASCII của s [0] - ASCII của "A"
-
Định nghĩa một hàm do (). Điều này sẽ mất a, b, op
-
nếu op giống như "+" thì
-
trả về a + b
-
-
nếu op giống như "-" thì
-
trả về a - b
-
-
nếu op giống như "*" thì
-
trả về a * b
-
-
nếu op giống như "/" thì
-
trả về a / b
-
-
Định nghĩa một hàm giải quyết (). Điều này sẽ mất tôi, j
-
nếu ma trận [i, j] là số thì trả về giá trị đó
-
ngược lại:
-
s:=matrix [i, j]
-
nếu s [0] giống với "=" thì
-
đối với mỗi c trong chuỗi con của s [từ chỉ mục 2 đến cuối], thực hiện
-
nếu c là bất kỳ toán tử nào trong (+, -, /, *) thì
-
op:=c
-
đi ra từ vòng lặp
-
-
-
[a, b]:=chuỗi con của s [từ chỉ mục 1 đến cuối] và chia nó bằng op
-
[aRes, bRes]:=[giải quyết (a), giải quyết (b)]
-
return do (aRes, bRes, op)
-
-
nếu không,
-
trả về giải quyết (getIdx (s))
-
-
-
đối với tôi trong phạm vi 0 đến số hàng của ma trận, hãy thực hiện
-
đối với j trong phạm vi 0 đến số cột của ma trận, thực hiện
-
ma trận [i, j]:=(giải quyết (i, j)) dưới dạng chuỗi
-
-
-
ma trận trả về
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn:
Ví dụ
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']]