要求:

对含有N个元素的数组循环右移K位,要求时间复杂度为O(N),且只允许使用两个附加变量。

分析:

方法一:蛮力法

要求将数组元素循环右移K位,只需要每次将数组中元素右移一位,循环K次即可。如原数组为abcd1234,右移4位具体移动过程为abcd1234-->4abcd123-->34abcd12-->1234abcd。

方法二:翻转法

直接上例子,对于数组序列A = [123456],如何实现循环右移2位功能?将数组A分成两个部分A[0,N-K-1]和A[N-K,N-1],将这两部分分别翻转,然后放在一起再翻转,具体如下:

①翻转1234:123456-->432156

②翻转56:432156-->432165

③翻转432165:432165-->561234

代码实现:

#方法一
# -*- coding:utf-8 -*-
def rightShift(arr,k):if arr == None:print("参数不合法!")returnlens = len(arr)k %= lens #因为K不一定小于N,有可能大于等于N,当K≥N时,右移K-N与右移K位效果一样while k != 0: #右移k位tmp = arr[lens-1] #数组最后一个元素放入临时变量中i = lens-1while i > 0:arr[i] = arr[i-1] #所有元素后移i -= 1arr[0] = tmp #第一个元素为初始最后一个元素的值k -= 1if __name__ == "__main__":k = 4arr = ['a','b','c','d','1','2','3','4']rightShift(arr,k)i = 0while i < len(arr):print(arr[i],end="")i += 1

运行结果:

1234abcd
#方法二
def reverse(arr,start,end):while start<end:temp = arr[start]arr[start] = arr[end]arr[end] = tempstart += 1end -= 1def rightShift(arr,k):if arr == None:print("参数不合法!")returnlens = len(arr)k %= lensreverse(arr,0,lens-k-1)reverse(arr,lens-k,lens-1)reverse(arr,0,lens-1)if __name__ == "__main__":k = 4arr = ['a','b','c','d','1','2','3','4']rightShift(arr,k)i = 0while i < len(arr):print(arr[i],end="")i += 1

运行结果

1234abcd

性能分析:

方法一每移动一次,其时间复杂度为O(N),故移动K次,总的时间复杂度为O(K*N),0<K<N,且时间复杂度不满足O(N)。

方法二时间复杂度为O(N),完成翻转操作只用了一个辅助存储空间。

Python算法——对数组进行循环移位相关推荐

  1. 本题要求实现一个用选择法对整数数组进行简单排序的函数。_通俗易懂讲 Python 算法:快速排序...

    原文:https://stackabuse.com/quicksort-in-python/ 作者:Marcus Sanatan 译者:老齐 欢迎在 bilibili  搜索 freeCodeCamp ...

  2. js数组按中文拼音排序_通俗易懂讲 Python 算法:快速排序

    原文:https://stackabuse.com/quicksort-in-python/ 作者:Marcus Sanatan 译者:老齐 欢迎在 bilibili  搜索 freeCodeCamp ...

  3. Python可以调用Gpu吗_加快Python算法的四个方法:Numba篇

    CDA数据分析师 出品 相信大家在做一些算法经常会被庞大的数据量所造成的超多计算量需要的时间而折磨的痛苦不已,接下来我们围绕四个方法来帮助大家加快一下Python的计算时间,减少大家在算法上的等待时间 ...

  4. java python算法_用Python,Java和C ++示例解释的排序算法

    java python算法 什么是排序算法? (What is a Sorting Algorithm?) Sorting algorithms are a set of instructions t ...

  5. 用Python找出数组中出现次数超过一半的数

    数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. 计数+比较 不考虑效率,采用最简单的办法,遍历数组,使用 List 的 count() 方法统计元素出现的次数: def more_th ...

  6. python算法和数据结构_Python中的数据结构和算法

    python算法和数据结构 To 至 Leonardo da Vinci 达芬奇(Leonardo da Vinci) 介绍 (Introduction) The purpose of this ar ...

  7. java python算法_用Java,Python和C ++示例解释的搜索算法

    java python算法 什么是搜索算法? (What is a Search Algorithm?) This kind of algorithm looks at the problem of ...

  8. python算法面试_求职面试的Python算法

    python算法面试 During software job interviews, candidates often have to solve algorithm challenges. In t ...

  9. python给矩阵赋值_解决Python二维数组赋值问题

    解决Python二维数组赋值问题 当我们采用s=[[0]*3]*2初始化一个数组,然后对s[0][0]进行赋值,改变的是第一列所有的值.因为用s = [[0]*3]*2 初始化数组,他表示的是指向这个 ...

最新文章

  1. Chain of Responsibility 责任链模式 MD
  2. PAT甲级1138 Postorder Traversal:[C++题解]前序遍历和中序遍历建树
  3. java map赋值给model_Map,Model,ModelMap使用方法
  4. 宝塔php的opcache模块未载入,宝塔面板CPU负载过高使用opcache扩展的解决方法
  5. 将Python脚本打包成可执行文件
  6. 授人以鱼不如授人以渔——CPU漏洞的Symantec解决之道
  7. 玩C一定用得到的19款Java开源Web爬虫
  8. 数据增量更新定义_TiDB 在 OPPO 准实时数据仓库中的实践
  9. 5月24日上课笔记-js操作DOM
  10. JavaScript中的对象学习笔记(属性操作)
  11. HDU 5934 2016CCPC杭州 B: Bomb(Trajan强连通)
  12. 四川电信在广元市建大数据中心
  13. 空间计量经济学(1)---空间计量简介与空间权重矩阵设置
  14. 简易智能自动问答机器人
  15. 程序猿生存指南-2 抽奖事件
  16. MySQL-Workbench数据库备份
  17. VC中调用cmd命令的四种方式
  18. 小强升职记思维导图_《小强升职记》思维导图与总结
  19. 实验吧之【让我进去】(哈希长度扩展攻击)
  20. cfa三级真题和mock_CFA考试历年官方mock题从哪里找?怎么下载?

热门文章

  1. mysql默认索引btree_BTREE这种Mysql默认的索引方式,具有普遍的适用性
  2. ArcGIS中ArcMap时间滑块功能对长时间序列栅格遥感影像进行动态显示并生成视频或动图
  3. 吸顶灯怎么固定天花板_吊灯怎么固定在顶上的 吊灯安装要注意什么问题
  4. windows10活动历史记录清除 删除windows时间线操作
  5. 定义一个中国银行类 要求实现 注册账号,存款、取款、查询余额功能。
  6. 阿里测试开发实习生面经
  7. mysql用于删除表中数据的关键字是_MySQL-删除数据(DELECT)
  8. 怪兽充电们的钱途难题,IPO来解?
  9. echarts进阶--销售趋势图
  10. 基于WEB的就业信息发布系统