首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

Python3实现旋转数组的3种算法

下面是python3实现的旋转数组的3种算法。 一、题目 给定一个数组,将数组中的元素向右移动k个位置,其中k是非负数。 例如: 输入: [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] 说明: 1.尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。 2.要求使用空间复杂度为 O(1) 的原地算法。 二,解题算法 解法一 以倒数第 k 个值为分界线,把 nums 截成两组再组合。因为 k 可能大于 nums 的长度(当这两者相等的时候,就相当于 nums 没有移动),所以我们取 k % len(nums),k 和 nums 的长度取余,就是最终我们需要移动的位置 代码如下: if nums:   k = k % len(nums)   nums[:]=nums[-k:]+nums[:-k] 时间:64ms 假设: nums= [1,2,3,4,5,6,7] k =3 运行结果: [5, 6, 7, 1, 2, 3, 4] 解法二 先把 nums 最后一位移动到第一位,然后删除最后一位,循环k次。k = k % len(nums) ,取余 代码如下: if nums:   k = k % len(nums)   while k > 0:     k -= 1     nums.insert(0, nums[-1])     nums.pop() 时间:172ms 假设: nums= [1,2,3,4,5,6,7] k =3 运行结果: [5, 6, 7, 1, 2, 3, 4] 解法三: 先把 nums 复制到 old_nums ,然后 nums 中索引为 x 的元素移动 k 个位置后,当前索引为 x+k,其值为 old_nums[x]。,所以我们把 x+k 处理成 (x+k)%len(nums),取余操作,减少重复的次数。 代码如下: if nums:   old_nums = nums[:]   l = len(nums)   for x in range(l):     nums[(x+k) % l] = old_nums[x] 时间:64ms 假设: nums= [1,2,3,4,5,6,7] k =3 运行结果: [5, 6, 7, 1, 2, 3, 4]

01

Python负数取余总结

余数存在正余数和负余数,要了解负余数,需要先了解取整原理 17 // 5 = 3 -17//5 = -4 17//-5 = -4 -17//-5 = 3 根据上述的4个公式,可以看出python的编译器是的取整符号位由被除数和除数同时决定,整数的数值是由向下取整的,即如果整数的符号位正,则取靠近0的数,如果整数是负数,则取远离0的数或者也可以这样理解:被除数和除数处于0的一边就往靠0的方向取整,如果是处于0的两边就往远离0的方向取整。 了解了取整原理后,再理解取余就比较简单了 17%5 = 2 这个没什么好解释,大家都了解的 -17%5= 3 该等式的被除数和除数处于0的两边,那必然是往远离0的方向取余数,2+3 = 5按照公式5 的正余数是2,那2所对应的负余数是3,余数符号位与被除数保持一致,为3 17%-5 = -3 同上例,因为被除数的符号为负,所以余数为-3 -17%-5 = -2,被除数与除数是在同一边,则往0靠,所以余数为整余数2,因为被除数的符号为负, 所以余数为-2

01
领券