这篇文章记录两道LeetCode官方编辑的初级算法中的数组部分的题目。
首先看第一道题。
移动零
LeetCode地址:移动零
本题要将数组中所有的零移动到数组最后,第一想法当然是冒泡,将每一个零一步一步移动到最后。
冒泡
class Solution:
def moveZeroes(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
n = len(nums)
for i in range(0,n):
for j in range(i+1,n):
if nums[i]==0:
t = nums[j]
nums[j] = nums[i]
nums[i] = t
冒泡方法很简单,但是时间复杂度为n的平方,因此速度比较慢。冒泡的思想是将零往后移,那么我们反向思考一下,为什么不能将非零元素往前移呢,这就是下面双指针方法的基本思想了。
双指针
初始化两个指针,后面的指针遇到非0元素就跟前面的指针交换位置,前面的指针每次交换完后往前移动一位。
class Solution:
def moveZeroes(self, nums: List[int]) -> None:
n = len(nums)
left = right = 0
while right < n:
if nums[right] != 0:
nums[left], nums[right] = nums[right], nums[left]
left += 1
right += 1
加一
这个题题目有点拗口,简单来讲就是将输入数组视为一个整数,然后将这个整数加一之后再转换为数组。既然这样的话,最简单的当然就是直接法了。
直接法
class Solution:
def plusOne(self, digits: List[int]) -> List[int]:
n = len(digits)
sum = 0
result = []
for i in digits:
sum = sum*10 + i
sum = sum + 1
sum = str(sum)
for i in sum:
result.append(int(i))
return result
这里使用了一些python内置函数,实际上这种做法虽然简单,但是我觉得太过于投机取巧。那么就看一下另一种方法。
方法二
方法二的思想在于,当数组最后一位不是9时,那么我们直接把最后一位加一就得到最终结果了,直接返回即可。而当最后一位为9时,就将最后一位置为0,然后往前遍历,如果前面一位不是9,那么就把这一位加一,如果这位还是9的话,就继续重复上一步置0。最后如果遍历结束都没有返回结果,说明数组每一位都是9,那么直接新建一个数组返回就可以了。
class Solution:
def plusOne(self, digits: List[int]) -> List[int]:
n = len(digits)-1
while(n>=0):
if not digits[n]==9:
digits[n] = digits[n]+1
return digits
digits[n] = 0
n = n-1
result = [0]*(len(digits)+1)
result[0] = 1
return result