iT邦幫忙

0

Leetcode 189題 Rotate Array(用Python)

敝人要問的是這題:
https://leetcode.com/problems/rotate-array/

使用以下解法
nums = nums[len(nums)-k:] + nums[:len(nums)-k]
卻顯示nums不變

必須使用shallow copy才能AC
nums[:] = nums[len(nums)-k:] + nums[:len(nums)-k]

小弟實在不懂,為何需使用shallow copy後才能修改到nums
在此先謝謝各位,如果題目描述得不夠清楚,本人會再補充

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

0
海綿寶寶
iT邦大神 1 級 ‧ 2020-10-27 11:15:21
最佳解答

你在 LeetCode 的發問
已經有人回答你了

差別在於有沒有寫[:] 決定會不會改到原本的值
以下是範例程式
應該可以看出其差別
結論是
#2 在 rotate 裡有改變 nums,不會影響到主程式裡的 nums
#3 在 rotate 裡有改變 nums[:],會修改到主程式裡的 nums

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.
        """
        print("   >>>>> in class >>>>>")
        print(nums)
        nums = nums[len(nums)-k:] + nums[:len(nums)-k]
        print(nums)
        print("   >>>>> in class >>>>>")
        
    def rotateByRef(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: None Do not return anything, modify nums in-place instead.
        """
        print("   >>>>> in class >>>>>")
        print(nums)
        nums[:] = nums[len(nums)-k:] + nums[:len(nums)-k]
        print(nums)
        print("   >>>>> in class >>>>>")        
        

k = 3
"""#1 Use variable directly"""    
print("#1 ===============")
nums = [1,2,3,4,5,6,7]
print(nums)

nums = nums[len(nums)-k:] + nums[:len(nums)-k]
print(nums)

"""#2 Class method by Value"""    
nums = [1,2,3,4,5,6,7]
print("#2 ===============")
print(nums)

me = Solution()
me.rotate(nums, k)
print(nums)

"""#3 Class method by Reference"""    
nums = [1,2,3,4,5,6,7]
print("#3 ===============")
print(nums)

me = Solution()
me.rotateByRef(nums, k)
print(nums)
ffaanngg iT邦新手 5 級 ‧ 2020-10-27 12:58:04 檢舉

謝謝你,這應該就是我要的答案
總之加入[:]後,才能改變到reference
不然修改到的只是函數中nums的copy,我這樣講對嗎?

0
japhenchen
iT邦超人 1 級 ‧ 2020-10-26 10:37:41

右旋

nums = nums[-1:] + nums[:len(nums)-1]

左旋

nums = nums[1:] + nums[0:1]
看更多先前的回應...收起先前的回應...
ffaanngg iT邦新手 5 級 ‧ 2020-10-26 10:55:48 檢舉

Japhen Chen你好
本人的問題在於,為何該題需使用nums[:] = nums[len(nums)-k:] + nums[:len(nums)-k]才能通過,而不是nums = nums[len(nums)-k:] + nums[:len(nums)-k]

array只有一維,或二維以上但沒有可變型態的值的情況下,就只要用shallow copy即可

ffaanngg iT邦新手 5 級 ‧ 2020-10-26 15:48:47 檢舉

我後來又研究了一下
這題和shallow copy沒什麼關係
使用nums = nums[len(nums)-k:] + nums[:len(nums)-k] 後,nums的記憶體位址改變了

而nums[:] = nums[len(nums)-k:] + nums[:len(nums)-k] 則不會

我要發表回答

立即登入回答