栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

【leetcode】189. 轮转数组(python)+ 本地测试

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【leetcode】189. 轮转数组(python)+ 本地测试

思路分析:原地修改,不使用额外空间(已AC)
思路:逆置
1.先把前n-k个元素逆置;2.再把倒数k个元素逆置;3.再整体逆置

初始顺序: [1,2,3,4,5,6]  # 假设 k = 2 (轮转两次)
step 1:   [4,3,2,1,5,6]  # 把前n-k个元素逆置
step 2:   [4,3,2,1,6,5]  # 把倒数k个元素逆置
step 3:   [5,6,1,2,3,4]  # 整体逆置

然后,我就晃晃晃一顿,写完了,本地测试测了几个没问题。
(ps,下边这个是错的!!!)

class Solution(object):   # 提交失败!!!
    def reverse(self,arr): #self代表类的实例,而非类。
        n = len(arr)
        i, j = 0, n-1
        for c in range(n//2):
            tmp = arr[i]
            arr[i] = arr[j]
            arr[j] = tmp
            i += 1
            j -= 1
        return arr
    def rotate(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: None Do not return anything, modify nums in-place instead.
        """
        n1 = len(nums)
        nums[:n1-k] = self.reverse(nums[:n1-k])
        nums[n1-k :] = self.reverse(nums[n1-k :])
        nums[:] = self.reverse(nums[:])
        # print(nums)     

这样子看起来没毛病呀? 那就提交试试把!然而!我还是小瞧了测试用例。。。

嗯?肿么回事?我一想,好吧,我确实没想到,轮转次数k可以比数组长度大呢!

那我怎么确定到底轮转了多少次呢?

答曰:轮转次数k < 数组长度(即, k < len(nums))的话,前边的思路是没问题的。

那么k>=len(nums)的情况下呢?

奥!对,当轮转次数k是数组长度的整数倍的时候,相当于是原数组保持原有顺序。有了,取模!取模后的余数就是最终轮转的次数。

特殊情况(原谅我一开始没想到):
k > len(nums)? or k = len(nums)? ——> 取模

(ps, 这个才是提交成功的(已AC))

# 通过40 ms 24.3 MB Python 2022/03/16 21:54
class Solution(object):
    def reverse(self,arr): #self代表类的实例,而非类。
        n = len(arr)
        i, j = 0, n-1
        for c in range(n//2):
            tmp = arr[i]
            arr[i] = arr[j]
            arr[j] = tmp
            i += 1
            j -= 1
        return arr
    def rotate(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: None Do not return anything, modify nums in-place instead.
        """
        n1 = len(nums)
        t = k % n1
        if t != 0: # k < len(nums) 也一样可以用取模的写法呀
            nums[:n1-t] = self.reverse(nums[:n1-t])
            nums[n1-t :] = self.reverse(nums[n1-t :])
            nums[:] = self.reverse(nums[:])
#             print(nums)   # 本地测试用的,不用care
#         else:
#             print(nums)
本地测试
# nums = [1,2,3,4,5,6,7]
# nums = [-1,-100,3,99]
nums = [1,2,3]
# nums = [1,2]

# 特殊情况:
# k >= len(nums)?   k=0 ?  k==len(nums)? 
# nums = [1,2] # output:[1,2]当k=2转了两轮又转回去了==》取模!
# 若取模==0,原样;
# 若取模!=0,移动'余数'个数

s = Solution()
s.rotate(nums,3)  

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/768820.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号