日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

leetcode旋转数组 c语言,leetcode explore 初级算法第三题,旋转数组代码实现

發布時間:2025/4/16 编程问答 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 leetcode旋转数组 c语言,leetcode explore 初级算法第三题,旋转数组代码实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

題目分析

因為題目不是很長,這里把題目貼出來:

給定一個數組,將數組中的元素向右移動 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),即不能新創建數組。

參考答案

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

target_pos = (pos + k) % nums_len

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

我的參考代碼如下:

'''

@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 了

總結

以上是生活随笔為你收集整理的leetcode旋转数组 c语言,leetcode explore 初级算法第三题,旋转数组代码实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。