返回顶部
首页 > 资讯 > 后端开发 > Python >python实现数组平移K位问题
  • 652
分享到

python实现数组平移K位问题

python数组数组平移K位python数组平移 2023-02-06 18:02:30 652人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录python数组平移K位Python对数组进行循环移位要求分析代码实现性能分析总结python数组平移K位 def move(ls: list, offset): """

python数组平移K位

def move(ls: list, offset):
    """
    元素原索引+位移数(正为右移,负为左移)之和求关于数组长度(数组的模)的余数,即为位移后的元素索引。
    再对新索引升序排序,去除索引,即为位移后的新数组
    :param ls:
    :param offset:
    :return:
    """
    mod = len(ls)
    ids = [[(item[0]+offset)%mod, item[1]] for item in enumerate(ls)]
    ids.sort(key=lambda item: item[0])
    return [item[1] for item in ids]

def move2(ls: list, offset):
    """
    分段反转,以位移数(对模求余)为界,分别反转两个子数组,再整体反转
    :param ls:
    :param offset:
    :return:
    """
    mod = len(ls)
    offset = offset % mod
    tail = list(reversed(ls[mod-offset:]))
    head = list(reversed(ls[:mod-offset]))
    return list(reversed(head+tail))

if __name__ == '__main__':
    nums = [8, 9, 10, 11]
    print(move(nums, 1))
    print(move2(nums, 1))

    print(move(nums, -1))
    print(move2(nums, -1))
    """
	[11, 8, 9, 10]
	[11, 8, 9, 10]
	[9, 10, 11, 8]
	[9, 10, 11, 8]
	"""

Python对数组进行循环移位

要求

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

运行结果

1234abcd

性能分析

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

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

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: python实现数组平移K位问题

本文链接: https://lsjlt.com/news/194383.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • python实现数组平移K位问题
    目录python数组平移K位Python对数组进行循环移位要求分析代码实现性能分析总结python数组平移K位 def move(ls: list, offset): """...
    99+
    2023-02-06
    python数组 数组平移K位 python数组平移
  • python数组中的 k-diff 数对例题解析
    目录一、题目描述二、思路分析方法一:构建哈希表方法二:双指针三、总结一、题目描述 题目内容: 题目示例: 题目解析: 1 <= nums.length <= 104-...
    99+
    2024-04-02
  • C语言如何实现数组移位、前移、后移与整体移动
    这篇文章主要介绍“C语言如何实现数组移位、前移、后移与整体移动”,在日常操作中,相信很多人在C语言如何实现数组移位、前移、后移与整体移动问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言如何实现数组移位、前...
    99+
    2023-07-05
  • c语言实现数组循环左移m位
    目录c语言数组循环左移m位数组循环左移的简单方法输入格式输出格式c语言数组循环左移m位 #include<stdio.h> //函数原型 void rightshiftl...
    99+
    2024-04-02
  • 数组循环移位操作实例
    题: 如标题,要求时间复杂度为O(N)。解法:右移k位,前k位逆序,后N-k位逆序,再整个逆序即可。复制代码 代码如下:#include <stdio.h> &...
    99+
    2022-11-15
    数组 循环 移位
  • python实现数组求和与平均值
    目录数组求和与平均值求数组元素的平均值数组求和与平均值 ls=[4,9,19,8,391,39,9,283,45] sum(ls) average=sum(ls)/len(ls) p...
    99+
    2024-04-02
  • 【数据结构】堆的实现,堆排序以及TOP-K问题
    目录 1.堆的概念及结构 2.堆的实现 2.1初始化堆 2.2销毁堆 2.3取堆顶元素 2.4返回堆的大小 2.5判断是否为空 2.6打印堆 2.7插入元素 2.8堆的向上调整 2.9弹出元素 2.10堆的向下调整 3. 建堆时间复杂度...
    99+
    2023-09-06
    数据结构 算法
  • 最大K个数问题的Python版解法总结
    TopK问题,即寻找最大的K个数,这个问题非常常见,比如从1千万搜索记录中找出最热门的10个关键词. 方法一: 先排序,然后截取前k个数. 时间复杂度:O(n*logn)+O(k)=O(n*logn)。 这...
    99+
    2022-06-04
    解法 个数 Python
  • Python OpenCV 图像平移的实现示例
    每次学习新东西的时候,橡皮擦都是去海量检索,然后找到适合自己理解的部分。 再将其拼凑成一个小的系统,争取对该内容有初步理解。 今天这 1 个小时,核心要学习的是图像的平移,在电脑上随...
    99+
    2024-04-02
  • Python中OpenCV图像平移怎么实现
    小编给大家分享一下Python中OpenCV图像平移怎么实现,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!每次学习新东西的时候,橡皮擦都是去海量检索,然后找到适合...
    99+
    2023-06-15
  • Python数组实践中的问题分析
    Python数组实践中的问题分析,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Python数组有很多的知识需要大家详细的学习。Python数组中没有数组的数据结构,但列表很...
    99+
    2023-06-17
  • python中小数点后的位数问题
    目录python中小数点后的位数第一种方法第二种方法第三种方法python小数点位数控制利用python内置的round()函数利用格式化方法利用math模块里ceil和floor方...
    99+
    2023-03-14
    python小数点 小数点后的位数 python位数
  • python怎么实现数组求和与平均值
    本文小编为大家详细介绍“python怎么实现数组求和与平均值”,内容详细,步骤清晰,细节处理妥当,希望这篇“python怎么实现数组求和与平均值”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。数组求和与平均值ls=...
    99+
    2023-06-30
  • 【AI】Python 实现八数码问题
    八数码问题 1. 题目介绍 八数码问题描述为:在 3×3 组成的九宫格棋盘上,摆有 8 张牌,每张牌都刻有 1-8 中的某一个数码。棋盘中留有一个空格,允许其周围的某张牌向空格移动,这样通过移动牌就可...
    99+
    2023-10-26
    算法 人工智能
  • js实现数组的扁平化
    目录数组扁平化的方式1.使用flat()2.使用正则3.使用reduce()+concat()4.使用函数递归5.使用扩展运算符+concat()总结 数组扁平化...
    99+
    2024-04-02
  • JavaScript这么实现数组扁平化
    这篇“JavaScript这么实现数组扁平化”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“...
    99+
    2024-04-02
  • js如何实现扁平化数组
    这篇文章主要介绍了js如何实现扁平化数组,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。扁平化数组在原型 Array 上有一个方法 flat,可以从一个数组的数组中制作一个单一...
    99+
    2023-06-27
  • JavaScript数组扁平化怎么实现
    这篇“JavaScript数组扁平化怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“JavaScript数组扁平化怎么...
    99+
    2023-07-02
  • Python中的二次移动平均法怎么实现
    这篇文章主要介绍了Python中的二次移动平均法怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python中的二次移动平均法怎么实现文章都会有所收获,下面我们一起来看看吧。二次移动平均法逻辑二次移动平均...
    99+
    2023-07-05
  • Python中怎么解决非平衡数据问题
    Python中怎么解决非平衡数据问题,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。SMOTE算法的介绍在实际应用中,读者可能会碰到一种比较头疼的问题,那就是分类...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作