189. Rotate Array
总结: 让数组右移K位
**解法: **
1.循环替换
描述: 从第一个元素开始,将该元素放置到变换后的位置上,原位置上的元素存入临时变量prev,再计算该元素变换后的位置,将prev赋给变换后的位置,而原来的元素以此类推。最终会跳转到第一个元素上。再对第二个元素继续跳转。设置一个计数器count,每放置一个变换后的元素就+1,当count==len(nums) 说明所有元素放置成功。
例子
k=k%len(nums)
start=0
count=0 #记录变换次数 等于len时停止
while(count < len(nums)):
current=start #当前没跳转前的位置
prev=nums[current] #当前没跳转前的值
while(True):
new_index=(current+k) % len(nums) #跳转后的位置
prev,nums[new_index]=nums[new_index],prev
current=new_index #以新的位置为下一次跳转的起点
count+=1
if(current==start): #当跳转会到start起始点 再对下一个位置的元素进行跳转
break
start+=1
2.反转法
描述:右移 K 次,就有k个元素从后面跑到前面来。可以先将数组整体反转 再反转前K个元素 再反转后len-k 个元素,就可以得到最后的结果。
例子
k=k%len(nums)
reverse(nums,0,len(nums)-1)
reverse(nums,0,k-1)
reverse(nums,k,len(nums)-1)
'''反转算法 ,start end 都是索引,两个指针分别从两端向中间移动。如果是奇数 最中间的元素不会被调换'''
def reverse(nums,start,end):
while(start < end):
nums[start],nums[end] = nums[end],nums[start]
start+=1
end-=1