leetcode explore 初級算法第三題,旋轉數組代碼實現

leetcode explore 初級算法第三題,旋轉數組代碼實現。原題連接:python

https://leetcode-cn.com/explore/featured/card/top-interview-questions-easy/1/array/23/算法

題目分析

由於題目不是很長,這裏把題目貼出來:數組

給定一個數組,將數組中的元素向右移動 k 個位置,其中 k 是非負數。

示例 1:

輸入: [1,2,3,4,5,6,7] 和 k = 3
輸出: [5,6,7,1,2,3,4]
解釋:
向右旋轉 1 步: [7,1,2,3,4,5,6]
向右旋轉 2 步: [6,7,1,2,3,4,5]
向右旋轉 3 步: [5,6,7,1,2,3,4]
示例 2:

輸入: [-1,-100,3,99] 和 k = 2
輸出: [3,99,-1,-100]
解釋: 
向右旋轉 1 步: [99,-1,-100,3]
向右旋轉 2 步: [3,99,-1,-100]
說明:

儘量想出更多的解決方案,至少有三種不一樣的方法能夠解決這個問題。
要求使用空間複雜度爲 O(1) 的 原地 算法。

題目意思很簡單,就是將數組日後移動 k 個位置,超出數組長度的從頭開始計算。若是隻是這個要求,題目特別簡單,新開一個數組,而後將原數組移動 k 保留到對應位置便可。而題目的難點在於須要「原地」移動,空間複雜度爲 O(1),即不能新建立數組。測試

參考答案

首先分析題意,很容易想出移動位置公式:code

target_pos = (pos + k) % nums_len

剩下的就是解決「原地」的問題,很容易想到一種思路,就是移動後,從移動後的位置再接着去移動,同時保留原來位置的數據。這樣只須要一個臨時變量去保存被替換的變量便可。但中間有一些坑,好比:有些數據移動 k 個會造成一個循環,好比 [-1,-100,3,99] 和 k = 2,-1 到 3, 3 又回到 -1,-1 又到 3。如何解決這些循環問題是關鍵。ip

個人參考代碼以下:leetcode

'''
@Author: demon
@Date: 2019-10-28 11:16:44
@LastEditors: demon
@LastEditTime: 2019-10-28 18:37:12
@Description: https://leetcode-cn.com/explore/featured/card/top-interview-questions-easy/1/array/23/ 旋轉數組
'''


class Solution(object):
    def rotate(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: None Do not return anything, modify nums in-place instead.
        """
        if not nums:
            return

        start_pos = 0
        move_count = 0
        nlen = len(nums)

        
        for i in range(0, nlen):
            if move_count == nlen:
                break
            pos = i
            move_num = nums[pos]
            while True:
                target_pos = (pos + k) % nlen
                tmp = nums[target_pos]
                nums[target_pos] = move_num
                move_count += 1
                if target_pos == i or move_count == nlen:
                    break

                pos = target_pos
                move_num = tmp


if __name__ == "__main__":
    s = Solution()
    nums = [1, 2, 3, 4, 5, 6, 7] 
    s.rotate(nums, k=3)
    print(nums)  # [5, 6, 7, 1, 2, 3, 4]

    nums = [-1, -100, 3, 99]
    s.rotate(nums, k=2)
    print(nums)  # [3, 99, -1, -100]

    nums = [-1, -100, 3, 99]
    s.rotate(nums, k=4)
    print(nums)  # [-1, -100, 3, 99]

    nums = [-1]
    s.rotate(nums, k=4)
    print(nums)  # [-1]

    nums = [-1]
    s.rotate(nums, k=0)
    print(nums)  # [-1]

    nums = [1, 2, 3, 4, 5, 6]
    s.rotate(nums, k=3)
    print(nums)  # [4, 5, 6, 1, 2, 3]

    nums = [1, 2, 3, 4, 5, 6]
    s.rotate(nums, k=2)
    print(nums)  # [5, 6, 1, 2, 3, 4]

上面給出了一些測試用例,基本上能覆蓋一些比較坑的狀況,若是你的代碼能過這些用例,基本也就能 AC 了get

相關文章
相關標籤/搜索