面试中算法(查找全排列的下一个数)

2024-05-07 11:28
文章标签 算法 面试 查找 排列

本文主要是介绍面试中算法(查找全排列的下一个数),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

有一个正整数,找出这个正整数所有数字全排列的下一个数。

  就是在一个整数所包含数字的全部组合中,找到一个大于且仅大于原数的新整数。

  如果是固定的几个数字,应该是在逆序排列的情况下最大,在顺序排列的情况下最小。

  如果给出1、2、3、4、5这几个数字。

    最大的组合:54321。

    最小的组合:12345。

 具体步骤:

1.从后向前查看逆序区域,找到逆序区域的前一位,也就是数字置换的边界。

2.让逆序区域的前一位和逆序区域中大于它的最小的数字交换位置。

3.把原来的逆序区域转为顺序状态。

class MyAll:#查找逆序区域的边界def find(self,ll):#循环for i in range(len(ll)-1,0,-1):#判断后一个数大于前一个数,获取索引if ll[i]>ll[i-1]:return  ireturn 0#逆序区域的前一位和逆序区域中大于它的最小的数字交换位置。def exchange(self,index,ll):#查找到逆序区域前一个数head=ll[index-1]#循环for i in range(len(ll)-1,0,-1):#判断前一个数<原来的数,则交换if head<ll[i]:ll[index-1]=ll[i]ll[i]=headbreakreturn ll#把原来的逆序转为顺序def reverse(self,index,ll):i=index    #查找的位置j=len(ll)-1  #最后一个位置#循环while i<j:# 交换ll[i],ll[j]=ll[j],ll[i]i+=1j-=1return ll#显示数据def show(self,ll):for i in ll:print(i,end='')print()def find_all_num(self,ll):#1.从后向前查看逆序区域,找到逆序区域的前一位,也就是数字置换的边界。index=self.find(ll)#如果数字边界是0,则已经是逆序了if index==0:return None#2.复制一个数列,防止被修改ll_copy=ll.copy()# 让逆序区域的前一位和逆序区域中大于它的最小的数字交换位置。self.exchange(index,ll_copy)#3.把原来的逆序转为顺序self.reverse(index,ll_copy)return ll_copyif __name__ == '__main__':my=MyAll()#初始化值12345list_num=list([1,2,3,4,5])#循环20个12345全排列整数for i in range(20):#调用方法,注意这个数列参数list_num,必须与左边的变量名字相同哦!!!list_num=my.find_all_num(list_num)#显示数据my.show(list_num)

 

每一步的时间复杂度都是O (n),所以整体时间复杂度也是O (n) !

这篇关于面试中算法(查找全排列的下一个数)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/967213

相关文章

MySQL中查找重复值的实现

《MySQL中查找重复值的实现》查找重复值是一项常见需求,比如在数据清理、数据分析、数据质量检查等场景下,我们常常需要找出表中某列或多列的重复值,具有一定的参考价值,感兴趣的可以了解一下... 目录技术背景实现步骤方法一:使用GROUP BY和HAVING子句方法二:仅返回重复值方法三:返回完整记录方法四:

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

C++作用域和标识符查找规则详解

《C++作用域和标识符查找规则详解》在C++中,作用域(Scope)和标识符查找(IdentifierLookup)是理解代码行为的重要概念,本文将详细介绍这些规则,并通过实例来说明它们的工作原理,需... 目录作用域标识符查找规则1. 普通查找(Ordinary Lookup)2. 限定查找(Qualif

使用雪花算法产生id导致前端精度缺失问题解决方案

《使用雪花算法产生id导致前端精度缺失问题解决方案》雪花算法由Twitter提出,设计目的是生成唯一的、递增的ID,下面:本文主要介绍使用雪花算法产生id导致前端精度缺失问题的解决方案,文中通过代... 目录一、问题根源二、解决方案1. 全局配置Jackson序列化规则2. 实体类必须使用Long封装类3.

C#实现查找并删除PDF中的空白页面

《C#实现查找并删除PDF中的空白页面》PDF文件中的空白页并不少见,因为它们有可能是作者有意留下的,也有可能是在处理文档时不小心添加的,下面我们来看看如何使用Spire.PDFfor.NET通过C#... 目录安装 Spire.PDF for .NETC# 查找并删除 PDF 文档中的空白页C# 添加与删

Springboot实现推荐系统的协同过滤算法

《Springboot实现推荐系统的协同过滤算法》协同过滤算法是一种在推荐系统中广泛使用的算法,用于预测用户对物品(如商品、电影、音乐等)的偏好,从而实现个性化推荐,下面给大家介绍Springboot... 目录前言基本原理 算法分类 计算方法应用场景 代码实现 前言协同过滤算法(Collaborativ

数据库面试必备之MySQL中的乐观锁与悲观锁

《数据库面试必备之MySQL中的乐观锁与悲观锁》:本文主要介绍数据库面试必备之MySQL中乐观锁与悲观锁的相关资料,乐观锁适用于读多写少的场景,通过版本号检查避免冲突,而悲观锁适用于写多读少且对数... 目录一、引言二、乐观锁(一)原理(二)应用场景(三)示例代码三、悲观锁(一)原理(二)应用场景(三)示例

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.