2021-08-13 数组:移动篇

41 阅读1分钟

2021-08-13 数组:移动篇

旋转数组

  • 复制数组,找规律:不再给出代码
  • 多轮循环移动:维护cnt表示访问过的数字,维护
class Solution:
    def rotate(self, nums: List[int], k: int) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        n = len(nums)
        k %= n
        if k == 0:return 
        start = 0
        tmp = nums[start]
        cnt = 0
        while cnt < n:
            nxt = (start + k) % n
            while nxt != start:
            	# 尤其是这一句,本来是需要三个步骤,但python中可以直接交换
                nums[nxt], tmp = tmp, nums[nxt]
                nxt = (nxt+k) % n
                cnt += 1
            nums[nxt] = tmp
            start += 1
            tmp = nums[start]
            cnt += 1
  • python中可以直接赋值:
class Solution:
    def rotate(self, nums: List[int], k: int) -> None:
        if len(nums)>1:
            k %= len(nums)
            nums[0:k],nums[k:]=nums[len(nums)-k:],nums[0:len(nums)-k]
  • 数组反转:
class Solution:
    def rotate(self, nums: List[int], k: int) -> None:
        k = k % len(nums)
        nums[:] = nums[::-1]
        nums[:k] = nums[:k][::-1]
        nums[k:] = nums[k:][::-1]

移动零

  • 两次遍历,填充数组:不再给出代码
  • 类似冒泡的想法:找到0和非0位置(双指针),交换即可
class Solution:
    def moveZeroes(self, nums: List[int]) -> None:
        i = 0
        j = 0
        while j < len(nums):
        	# 指针i指向当前最前方的0,j指向最前方未被替换的非0
            if nums[j] != 0:
                nums[i],nums[j] = nums[j],nums[i]
                i+= 1
            j += 1