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