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

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

相关文章

Java比较和交换示例 - CAS算法

Java比较和交换示例 - CAS算法 由Lokesh Gupta | 提起下:多线程 一个Java 5中最好添加的是支持类,如原子操作AtomicInteger,AtomicLong等等。这些课程帮助您最大限度地减少复杂的(非必要)需要多线程的,如增加一些基本的操作代码或递减的值在多个线程之间共享。这些类内部依赖于名为CAS(比较和交换)的算法。在本文中,我将详细讨论这个概念。 1.乐观和

Java内存管理 - 垃圾收集算法

我们都知道Java 中垃圾收集器 [GC] 的功能。但只有少数人试图深入了解垃圾收集的工作原理。你不是其中之一,这就是你在这里的原因。 在这个Java内存管理教程中,我们将尝试了解Java垃圾收集的当前算法,我们将了解这些算法的演变。 目录1. Java中的内存管理2.引用计数机制3.标记和清除机制4.停止并复制GC 5.分代停止和复制6.如何提高Java中的内存利用率 1.

继续卷!面试又问Spring 事务有几种传播行为和隔离级别?

怕什么真理无穷 进一步有近一步的欢喜 面试又被问到了事务,来吧,要么卷起来,要么躺平。卷不动躺平会不会导致数据不一致? 事务概念 事务是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。 说简单点就是,要么所有执行success,不然就fail。它最终的目标:数据不会被破坏。即事务操作成功,数据的结果和业务期待的结果是一致的。 事务的属性 一个逻辑工作单元要成为事

有感FOC算法学习与实现总结

文章目录 基于STM32的有感FOC算法学习与实现总结1 前言2 FOC算法架构3 坐标变换3.1 Clark变换3.2 Park变换3.3 Park反变换 4 SVPWM5 反馈部分5.1 相电流5.2 电角度和转速 6 闭环控制6.1 电流环6.2 速度环6.3 位置环 写在最

面试十大潜规则,出来混你中过几个?

点击上方“小麦大叔”,选择“置顶/星标公众号” 福利干货,第一时间送达 大家好,我是小麦,金九银十,相信有不少找工作的同学,今天和大家分享一篇面试相关的文章,聊一聊面试中的潜规则,希望对您有所帮助。 1.大纲 潜规则1:面试的本质不是考试,而是告诉面试官你会做什么 很多刚入行的小伙伴特别容易犯的一个错误,不清楚面试官到底想问什么,其实整个面试中面试官并没有想难道你的意思,只是想通过提问的方式来

面试常问的16个C语言问题,你能答上来几个?

大家好,我是小麦。最近不少小伙伴在找工作,这里我给大家分享一下面试中经常会遇到的一些嵌入式C语言问题,你看看能答上来几个呢? 1 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题) #define SEC_YEAR  (365*24*60*60)UL 考察点: #define 语法的基本知识(例如:不能以分号结束,括号的使用,等等)懂得预处理器将为你计算常数表达式

算法的设计方式

1.贪心算法 贪心算法(又称贪婪算法)是指在对问题求解时,从问题的某一个初始解出发,总是做出在当前看来最好的选择,当达到某算法中的某一步不能再继续前进时,算法停止。这时,就得到了问题的一个解,但不能保证求得的最后解是最优的。也就是说,不从整体最优上加以考虑,它所做出的仅是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,但对范围相当广泛的许多问题能产生整体最优解或者是整体最优解

冒泡算法及改进(属于交换排序)

冒泡排序(Bubble Sort)是一种交换排序,快速排序也属于一种交换排序。冒泡排序的基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。 假设一共共有 n 个数,则会进行 (n-1)趟比较,由1,2......n-1这么多趟,第一趟进行 (n-1)次比较,.......第n-1趟进行1次比较,故有公式:第i趟 +  第i趟的比较次数 = n       时间复杂度为

算法day07

第一题 30. 串联所有单词的子串         上题题意如下:          将w数组里面的字符串随机排列,只要在s字符串中找到相对应的w组成的字符串,则返回s中对应字符串首位元素的第一个下标;                  有上述题意所知,解题思路如上一题故事,本题采用hash表和滑动窗口的模型;         首先对于words字符串数组进行处理: