列表偏移

题目要求

lst = [1,2,3,4,5],列表向右偏移两位后,变成lst = [4,5,1,2,3]

思路分析

第一种方式:用切片将 [1,2,3] 和 [4,5] 取出来,之后合并在一起

lst = [1,2,3,4,5]
result = lst[3:]+lst[:3]
print(result)

或者

lst = [1,2,3,4,5]
result = lst[len(lst)-2:]+lst[:len(lst)-2]
print(result)

这种始终利用了本来的切片方式,实际我们还是得通过算法方式锻炼底层思维逻辑。

第二种方法:算法,每次只偏移一位,取末尾数据,赋予第一位数据的逻辑。

首先,需考虑偏移的位置大于列表本身情况,例如向右偏移6位,实际上是右偏移一位,则取余即可,6%5=1。

其次,只考虑每次偏移一位的实现方式:先将末尾的位数记录下来,赋予一个临时变量tmp

其他位置的数据全部右移一位

将第一位数据重新赋为tmp

lst = [1,2,3,4,5]
count = int(input('请输入偏移位数:'))
count = count % len(lst)
for i in range(count):
tmp = lst[-1]
for j in range(len(lst)-1,0,-1):
lst[j] = lst[j-1]
lst[0] = tmp
print(lst)

优化思考

python当中的列表,其实就是线性表,因为它满足以下条件:元素之间有顺序、有限

第一个元素无前驱、最后一个元素无后续

中间元素各有其一前驱其一后续

元素之间是一对一关系

那么它的偏移操作就是符合线性表的(插入+删除)的操作:偏移位置大于线性表长度,则取余

获取最后一个位置为插入数据元素

从最后一个位置开始向前遍历到第1个位置,分别都将它们向后移动一个位置

将最后一个位置覆盖到第一个位置

线性表的插入操作就是:插入位置不合理,抛异常

如果线性表长度大于等于数组长度,则抛出异常或动态增加容量

从最后一个元素开始向前遍历到第i个位置,分别将它们都向后移动一个位置

将要插入元素填入位置i处

表长加1


例如:火车票插队加塞,后面全部退一步,但是后面的人不知道为什么要退后一步,只知道前面位置退,跟着退

线性表的缺点:从这个偏移案例看出,线性表的插入、删除等操作需要移动大量元素

欢迎交流相互学习。