我最近在編碼挑戰中失敗了,我想知道問題的解決方案。
以下是對我的要求(根據記憶,因為我無法再訪問該問題):
創建一個函式,它接受一個整數陣列并對第一項和最后一項求和,然后是第二項和倒數第二項,依此類推。您必須這樣做,直到回傳陣列中只剩下兩個專案。
例子:
Input: [1, 4, 2, 3, 6, 10]
Returns: [16, 10]
因為:
[(1 10), (4 6), (2 3)] =
[11, 10, 5] =>
[(11 5), 10] =
[16, 10]
示例 2:
Input: [-1, 3, 2, -2, 11, 7, -9]
Returns: [-12, 23]
因為:
[(-1 (-9)), (3 7), (2 11), -2] =
[-10, 10, 13, -2] =>
[(-10 (-2)), (10 13)] =
[-12, 23]
約束:
-101 < arr[i] < 101
你可以假設每個arr[i]都是獨一無二的
這是我解決這個問題的嘗試:
def sumFirstAndLast (array):
if len(array) == 2:
return array
else:
left = 0
right = len(array) - 1
result = []
while left < right:
result.append(array[left] array[right])
left = 1
right -= 1
array = result
result = sumFirstAndLast(array)
return result
但它拋出一個錯誤:
Traceback (most recent call last):
File "<string>", line 22, in <module>
File "<string>", line 11, in sumFirstAndLast
IndexError: list index out of range
>
有人可以為我提供解決此問題的方法嗎?為什么我會收到此錯誤?我處理這個問題的邏輯不正確嗎?
uj5u.com熱心網友回復:
array = result并且result = sumFirstAndLast(array)應該放在while回圈之外leftright如果有奇數元素,可能等于。之后while left < right我們需要額外的條件檢查if left == right。
代碼可以如下:
def sumFirstAndLast (array):
if len(array) == 2:
return array
else:
left = 0
right = len(array) - 1
result = []
while left < right:
result.append(array[left] array[right])
left = 1
right -= 1
if left == right:
result.append(array[left])
return sumFirstAndLast(result)
uj5u.com熱心網友回復:
我認為遞回使得推理發生了什么變得更加困難(因此,更難推理出什么是錯誤的)。
相反,我會迭代地解決這個問題,重復執行操作,直到你有一個只有兩個元素的串列。代碼最終與遞回版本非常相似,但在我看來它更具可讀性(因此更容易除錯):
def sumFirstAndLast (array):
if len(array) == 2:
return array
result = array.copy()
while len(result) > 2:
left = 0
right = len(result) - 1
new_result = []
while left < right:
new_result.append(result[left] result[right])
left = 1
right -= 1
if left == right:
new_result.append(result[left])
result = new_result
return result
uj5u.com熱心網友回復:
一些問題:
兩個陳述句的縮進是錯誤的。遞回呼叫不應在回圈內進行,而應在回圈完成后進行。
當陣列的大小為奇數時,中間元素當前被忽略并丟棄。它仍應添加到結果中。
如果有保證,這不是一個大問題,但你應該更好地保護你的函式,以防陣列的值少于2 個。
因此,無需對您的代碼進行任何其他更改,它將變為:
def sumFirstAndLast (array):
if len(array) <= 2:
return array
else:
left = 0
right = len(array) - 1
result = []
while left < right:
result.append(array[left] array[right])
left = 1
right -= 1
if left == right: # There is a middle element. It needs to be retained
result.append(array[left])
array = result
result = sumFirstAndLast(array) # recursion outside of the loop
return result
在更緊湊的迭代版本中,它可能是:
def sumFirstAndLast (array):
while len(array) > 2:
array = [
array[i] array[-i-1] for i in range(len(array) // 2)
] ([array[len(array) // 2]] if len(array) % 2 else [])
return array
uj5u.com熱心網友回復:
我也會試著給你一些建議。
基本上,當你解決一個問題時,你應該把它分解成更小的問題。開始輸入。當您使用操作 2 到 2 時,您應該想,如果輸入小于 2 會發生什么,這是您操作所需的最小數量。其次,如果我的輸入是奇數或偶數會怎樣?是一樣的嗎?在這種情況下不是。最后,嘗試接近一個回圈并在回圈整個事物之前查看輸出并獲得混亂的輸出。
考慮到這一點,如果提供的輸入沒有操作所需的最小大小,您將解決問題:
if len(array) < 2:
return "Array must be of size bigger than 2"
針對奇數情況求解單個回圈:
for i in range(int(len(array) / 2) len(array) % 2):
if i < len(array) - i - 1:
new_array.append(array[i] array[len(array) - i - 1])
為偶數情況求解單個回圈:
for i in range(int(len(array) / 2) len(array) % 2):
if i < len(array) - i - 1:
new_array.append(array[i] array[len(array) - i - 1])
if len(array) % 2:
new_array.append(array[int(len(array) / 2)])
現在你有一個單例回圈,做完整的回圈:
while len(array) > 2:
for i in range(int(len(array) / 2) len(array) % 2):
if i < len(array) - i - 1:
new_array.append(array[i] array[len(array) - i - 1])
if len(array) % 2:
new_array.append(array[int(len(array) / 2)])
array = new_array
new_array = []
將所有這些結合在一起,您就有了解決方案:
def solve(array):
if len(array) < 2:
return "Array must be of size bigger than 2"
new_array = []
while len(array) > 2:
for i in range(int(len(array) / 2) len(array) % 2):
if i < len(array) - i - 1:
new_array.append(array[i] array[len(array) - i - 1])
if len(array) % 2:
new_array.append(array[int(len(array) / 2)])
array = new_array
new_array = []
return array
最后你可以尋找一個緊湊的解決方案,因為現在你至少解決了面試中的問題,并且得到了邏輯。
def solve(array):
if len(array) < 2:
return "Array must be of size bigger than 2"
while len(array) > 2:
remainder = (array[int(len(array) / 2)]) if len(array) % 2 else False
array = [(array[i] array[len(array) - i - 1]) for i in range(int(len(array) / 2))]
array.append(remainder) if remainder is not False else None
return array
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/488856.html
上一篇:正則運算式保留字串中的特定單詞
