📅  最后修改于: 2023-12-03 15:42:06.392000             🧑  作者: Mango
有一个长度为n的正整数数组nums,你需要重新排列它使得前缀和数组的乘积不为0。前缀和数组的第i个元素preSum[i]表示数组nums中前i个元素的和。
对于任何一个数a,如果它为0,那么将其放到数组最后即可。否则,将非0数放到数组前面,并记录0的个数zeroCount。当非0数都被放好后,如果zeroCount=n-1,则说明0是数组的唯一元素,将其中一个非0数与0交换即可;如果zeroCount<n-1,则将0放到数组末尾保证前缀和数组的乘积不为0。
class Solution:
def moveZeroes(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
zeroCount = 0
for i in range(len(nums)):
if nums[i] == 0:
zeroCount += 1
else:
nums[i-zeroCount] = nums[i]
for i in range(len(nums)-zeroCount, len(nums)):
nums[i] = 0
if zeroCount == len(nums)-1:
nums[0], nums[-1] = nums[-1], nums[0]
本题的思路比较简单,关键在于代码的实现。需要注意的是,在第二次循环时,起始位置为len(nums)-zeroCount,而不是len(nums)-1,因为数组最后已经被交换了一些元素。此外,如果0是唯一元素,需要将其中一个非0元素与0交换,否则前缀和数组的乘积仍然为0。