สมมติว่าเรามีเมทริกซ์ 2 มิติที่แสดงถึงสเปรดชีต 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
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้
-
กำหนดฟังก์ชั่น แก้ไข() นี่จะใช้เวลา s
-
ถ้า s เป็นตัวเลข ให้คืนค่า s เป็นจำนวนเต็ม
-
มิฉะนั้นให้แก้ปัญหา (getIdx(s))
-
กำหนดฟังก์ชัน getIdx() นี่จะใช้เวลา s
-
ส่งคืนรายการที่ค่าแรกเป็นสตริงย่อยของ s จาก 1 ถึงสิ้นสุดเป็นจำนวนเต็ม และค่าที่สองคือ ASCII ของ s[0] - ASCII ของ "A"
-
กำหนดฟังก์ชัน do() นี่จะใช้เวลา a, b, op
-
ถ้า op เหมือนกับ "+" แล้ว
-
คืนค่า a + b
-
-
ถ้า op เหมือนกับ "-" แล้ว
-
กลับ a - b
-
-
ถ้า op เหมือนกับ "*" แล้ว
-
คืนค่า a * b
-
-
ถ้า op เหมือนกับ "/" แล้ว
-
กลับ a / b
-
-
กำหนดฟังก์ชัน Solve() นี่จะใช้เวลา i, j
-
ถ้า matrix[i,j] เป็นตัวเลข ให้คืนค่านั้น
-
อย่างอื่น:
-
s :=matrix[i, j]
-
ถ้า s[0] เหมือนกับ "=" แล้ว
-
สำหรับแต่ละ c ในสตริงย่อยของ s[จากดัชนี 2 ถึงจุดสิ้นสุด] ทำ
-
ถ้า c เป็นโอเปอเรเตอร์ใดๆ ใน (+, -, /, *) แล้ว
-
op :=c
-
ออกจากวง
-
-
-
[a, b] :=สตริงย่อยของ s [จากดัชนี 1 ถึงจุดสิ้นสุด] และแยกด้วย op
-
[aRes, bRes] :=[แก้ไข(a) , แก้ไข(b)]
-
return do(aRes, bRes, op)
-
-
มิฉะนั้น
-
กลับแก้(getIdx(s))
-
-
-
สำหรับฉันในช่วง 0 ถึงจำนวนแถวของเมทริกซ์ ทำ
-
สำหรับ j ในช่วง 0 ถึงจำนวนคอลัมน์ของเมทริกซ์ ให้ทำ
-
matrix[i, j] :=(แก้(i, 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']]