題目描述
給你一個長度固定的整數(shù)數(shù)組 arr介返,請你將該數(shù)組中出現(xiàn)的每個零都復(fù)寫一遍敌完,并將其余的元素向右平移享钞。
注意:請不要在超過該數(shù)組長度的位置寫入元素号胚。
要求:請對輸入的數(shù)組 就地 進(jìn)行上述修改女器,不要從函數(shù)返回任何東西栖秕。
示例 1:
輸入:[1,0,2,3,0,4,5,0]
輸出:null
解釋:調(diào)用函數(shù)后,輸入的數(shù)組將被修改為:[1,0,0,2,3,0,0,4]
示例 2:
輸入:[1,2,3]
輸出:null
解釋:調(diào)用函數(shù)后晓避,輸入的數(shù)組將被修改為:[1,2,3]
解法
由描述可知簇捍,該題目要求在數(shù)組中的每個零后添加一個零,原零后數(shù)組元素右移一位俏拱。
最簡單方式自然是遍歷數(shù)組元素暑塑,每遇到一個零,將后續(xù)所有元素右移一位锅必,填入零元素事格,直至數(shù)組末尾。但是該方式下搞隐,一個元素可能存在多次重復(fù)移動的操作驹愚,如果能直接確定每一個元素的最終位置,一次將元素移動到最終位置的話劣纲,則執(zhí)行上較為高效逢捺。
由題目可知,每個元素的最終位置為癞季,當(dāng)前元素位置加上該元素前零的個數(shù)劫瞳。所以不妨計算出元素前零的個數(shù)倘潜,則可以直接一次將元素移動到最終位置上。
在遍歷數(shù)組計算零的個數(shù)時志于,不一定遍歷到數(shù)組末尾涮因,因為數(shù)組中若存在零,則必然有元素被移除數(shù)組伺绽;
需要注意下养泡,如果最后一個元素是零的話,需要判斷復(fù)寫該零值奈应,是否超出數(shù)組邊界瓤荔。
class Solution:
def duplicateZeros(self, arr: List[int]) -> None:
"""
Do not return anything, modify arr in-place instead.
"""
count,i=0,0
while i+count<len(arr):
if arr[i]==0:
count+=1
i+=1
i-=1
if i+count==len(arr):
arr[-1],count,i=0,count-1,i-1
while i>=0 and count>0:
arr[i+count]=arr[i]
if arr[i]==0:
count-=1
arr[i+count]=0
i-=1