python - 简单算法题 - 列表偏移

列表偏移

来源:http://www.coolpython.net/python_primary/algorithm_exercises/easy_list_shift.html

题目要求

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

image-20200729225813099

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

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

欢迎交流相互学习。

image-20200722093418350

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值