假设我们有一个2D矩阵代表一个Excel电子表格。我们必须找到所有计算出的单元格和公式都相同的矩阵。一个Excel电子表格如下所示
B1 | 7 | 0 |
3 | 5 | = A1 + A2 |
列名为(A,B,C ...),行名为(1、2、3 ...)。每个单元格将包含一个值,对另一个单元格的引用或用于操作的excel公式在数字或单元格参考之间。(例如,“ = A1 + 5”,“ = A2 + B2”或“ = 2 + 5”)
所以,如果输入像
B1 | 7 | 0 |
3 | 5 | = A1 + A2 |
那么输出将是
7 | 7 | 0 |
3 | 5 | 10 |
因为B1 = 7(第一行第二列),并且“ = A1 + A2”是7 + 3 = 10。
为了解决这个问题,我们将按照以下步骤
定义一个功能resolve()
。这将花费
如果s是数字,则将s作为整数返回
否则返回solve(getIdx(s))
定义一个功能getIdx()
。这将花费
返回一个列表,其中第一个值为s的子字符串,从1到结尾为整数,第二个值为s [0]的ASCII-“ A”的ASCII
定义一个功能do()
。这将需要a,b,op
如果op与“ +”相同,则
返回a + b
如果op与“-”相同,则
返回a-b
如果op与“ *”相同,则
返回a * b
如果op与“ /”相同,则
返回a / b
定义一个功能solve()
。这需要我,j
如果matrix [i,j]是数字,则返回该值
除此以外:
返回solve(getIdx(s))
对于s [从索引2到结尾]的子字符串中的每个c,执行
[a,b]:= s的子字符串[从索引1到结尾]并用op拆分
[aRes,bRes]:= [resolve(a),resolve(b)]
返回do(aRes,bRes,op)
op:= c
从循环中出来
如果c是(+,-,/,*)中的任何运算符,则
s:= matrix [i,j]
如果s [0]与“ =”相同,则
除此以外,
对于范围在0到矩阵行数的i,执行
matrix [i,j]:=(solve(i,j))作为字符串
对于范围从0到矩阵的列数的j,执行
返回矩阵
让我们看下面的实现以更好地理解:
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))
[["B1", "7", "0"], ["3", "5", "=A1+A2"] ]
输出结果
[['7', '7', '0'], ['3', '5', '10']]