题目描述:
解题思路:
方法一:
首先对k进行分类讨论。
(1)当k < 列表长度 的时候,我们直接截取数组后k个元素,放入temp列表中。然后将剩下的元素,向右移动k个位置。最后将temp中的元素倒序放入原列表nums的前面即可。
(2)当k > 列表长度的时候,我们得先让k对列表长度取模,之后采取和(1)一样的处理方式。
代码与注释:
class Solution:
def rotate(self, nums, k):
"""
Do not return anything, modify nums in-place instead.
"""
temp = []
# 指向列表中的最后一个元素
i = len(nums) - 1
count = 0
# 这一步相当关键,是为了避免k大于列表长度
k = k % len(nums)
while (True):
if count == k:
break
temp.append(nums[i])
i -= 1
count += 1
# 将剩下的元素,向右移动k个位置
while(i >= 0):
nums[i + k] = nums[i]
i -= 1
# 将之前temp的元素倒序全部放到nums的最前面
j = len(temp) - 1
k = 0
while (j >= 0):
nums[k] = temp[j]
k += 1
j -= 1
结果:
方法二:
(1)确定k,当k<列表长度时,k=k;当k>列表长度时,k应该对列表长度取模。所以第一步就应该是k = k%列表长度。
(2)巧用切片,将右边的k个元素放到列表最前面,将剩下的元素放到后面。达到了向右轮转了k个元素的效果!
代码与注释:
class Solution:
def rotate(self, nums, k):
"""
Do not return anything, modify nums in-place instead.
"""
# 获取列表长度
n = len(nums)
# 得到真正的k
k = k % n
# 巧用切片
nums[:] = nums[n-k : ] + nums[: n-k]