列表偏移
题目要求
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
例如:火车票插队加塞,后面全部退一步,但是后面的人不知道为什么要退后一步,只知道前面位置退,跟着退
线性表的缺点:从这个偏移案例看出,线性表的插入、删除等操作需要移动大量元素
欢迎交流相互学习。