สมมติว่าเรามีเมทริกซ์ 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']]