首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

寻找一个数的最小排列的程序,但应该大于另一个给定的数n1;如果不可能,则打印“n2”

这个问题可以通过以下步骤来解决:

  1. 首先,将给定的数n1转换为字符串,并将其按照从高位到低位的顺序拆分为单个数字。
  2. 从最低位开始,找到第一个比其右边数字小的数字,记为pivot。
  3. 如果找不到pivot,说明无法找到比n1大的排列,打印"n2"。
  4. 如果找到了pivot,再从最低位开始,找到第一个比pivot大的数字,记为swap。
  5. 将pivot和swap交换位置。
  6. 将pivot右边的数字按照升序排列,确保得到的排列是最小的。
  7. 将排列转换为数字形式,并打印结果。

下面是一个示例的Python代码实现:

代码语言:txt
复制
def find_next_permutation(n1):
    # 将n1转换为字符串,并拆分为单个数字
    digits = list(str(n1))
    
    # 从最低位开始找到pivot
    pivot_idx = -1
    for i in range(len(digits)-2, -1, -1):
        if digits[i] < digits[i+1]:
            pivot_idx = i
            break
    
    # 如果找不到pivot,打印"n2"
    if pivot_idx == -1:
        print("n2")
        return
    
    # 从最低位开始找到swap
    swap_idx = -1
    for i in range(len(digits)-1, pivot_idx, -1):
        if digits[i] > digits[pivot_idx]:
            swap_idx = i
            break
    
    # 交换pivot和swap
    digits[pivot_idx], digits[swap_idx] = digits[swap_idx], digits[pivot_idx]
    
    # 将pivot右边的数字按照升序排列
    digits[pivot_idx+1:] = sorted(digits[pivot_idx+1:])
    
    # 将排列转换为数字形式,并打印结果
    result = int(''.join(digits))
    print(result)

# 测试
find_next_permutation(123)  # 输出132
find_next_permutation(321)  # 输出n2

这个程序可以找到大于给定数n1的最小排列,如果不存在这样的排列,则打印"n2"。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

PAT 1010 Radix (25分) radix取值无限制,二分法提高效率

N1,N2,给出其中个数N1N2进制(输入数据中tag=1表示这这是给出N1进制,tag=2表示给出N2进制),为第二个数寻找合适进制,使得 两者转换成10进制后结果相等。...(以第个数进制给出,转换成十进制结果是N1,求N2进制为例进行说明) 假如N2每个位置上数字中最大那个是 x ,那么N2进制最小是 x + 1,比如你某个位置是0-9,最起码得是10进制吧。...注意不要漏掉对溢出情况判断,若N2在某进制下转换成十进制结果大于N1应该缩小右边界;但是,如果N2在某进制下转换成十进制结果小于0,也要缩小右边界,小于0说明进制太大,它转换后long long...n1,n2,给出其中个数n1及其进制radix,为第二个数寻找合适进制使得 两者相等 * * 首先,每个数长度最多为10,每个位置大小都可以是0-35,那么int肯定是不够存,比如这个数是zzzzzzzzzz...* * 假如n2只有位,那么你进制只要比这个数字大,就可以任意取,随意,除非你本身和n1相等,否则你取啥进制都没办法, * 因为最后个位置是最低位,它代表是 进制 ^ 0 = 1 *

56030

Python学习:基础练习题

1/2/3/4:a请输入正确运算符请输入你选择1/2/3/4:22请输入正确运算符请输入你选择1/2/3/4:225.编写程序,提示“选择运算符”,输入“1/2/3/4”后,继续输入要进行运算个数字后...,打印出运算结果图片def add(n1,n2): value = n1+n2 print("%d + %d = %d"%(n1,n2,value))def minus(n1,n2):...第轮是7个数进行比较,然后比较出最小值放在最后。然后第二轮比较前6个值。以此类推。剩下2个数时候,次比完。所以需要比轮次是 数组长度减去1 。...每轮需要比较数量,第轮是数组长度,之后每轮减1.7.二分查询,对个有序数组进行查询,从数组中间取出个值,和需要查询值进行对比。如果大于需要查询值,则取左边半继续进行二分查询。...如果小于需要查询值,则取右边半继续进行二分查询。如果相同,给出下标。

44110

大 leet(三之和)难度:中等 DAY-12

特殊情况排除 数组长度小于 3 数组最后项小于 0(排序之后) 第次循环得到结果作为第个数,当第个数 当第个数大于 0,说明之后不会有与他组合满足条件数了 第二个数从第个之后依次向后查找...第三个数从最后个数依次向前查找 当第二个数指针大于最后个数指针时终止循环 当数组中存在重复数组时,按照上面的逻辑会有重复答案出现 初始化个 map 去满足条件任何两个数组合作为 map...start 和 end 在固定值右侧移动寻找 start + end = -(固定值) 如果和小于 0,说明 start 对应值太小,应该右移,反之 end 左移 如果和等于零就记录下来, L...经过了排序,如果外层遍历已经大于 0,另外两个数大于 0,sum 不会等于 0,所以这种情况直接 break 结束遍历 /** * @param {number[]} nums * @return...声明 map 记录重复不仅增加了内存占用,也在 map 存储和查询时增加了时间成本 优化: 第二个数后面个数增加后与上个相同默认重复 最后个数也类似

39430

单片机常用14个C语言算法

例:用随机函数产生100个[0,99]范围内随机整数,统计个位上数字分别为1,2,3,4,5,6,7,8,9,0个数打印出来。   ...1; } 四、验证哥德巴赫猜想   (任意大于等于6偶数都可以分解为两个素数之和) 基本思想:n为大于等于6偶数,可分解为n1n2个数,分别检查n1n2是否为素数,如都是,...,其余n-1个数中选最小,与第2个数交换位置; 3)依次类推,选择了n-1次后,这个数列已按升序排列。...用变量p表示a数组元素下标,p初值为1,使x与a[p]比较,如果x不等于a[p],使p=p+1,不断重复这个过程;旦x等于a[p]退出循环;另外,如果p大于数组长度,循环也应该停止。...这种信号特点是信号本身在某数值范围附近上下波动 ,如测量流量、 液位; 基本方法:按输入N 个采样数据 ,寻找这样个 Y ,使得 Y 与各个采样值之间偏差平方和最小

1.5K40

蓝桥杯集锦04(python3)

输入格式 输入行包含个单词,单词只由小写英文字母组成。 输出格式 输出两行,第行包含个英文字母,表示单词中出现得最多字母是哪个。如果有多个字母出现次数相等,输出字典序最小那个。...如果得分至少是 分,称为及格。如果得分至少为 分,称为优秀。 请计算及格率和优秀率,用百分数表示,百分号前部分四舍五入保留整数。 输入格式 输入行包含个整数 ,表示考试人数。...你任务是通过编程,找出断号ID和重号ID。 假设断号不可能发生在最大和最小号。 输入格式 要求程序首先输入个整数N(N<100)表示后面数据行数。 接着读入N行数据。...每行数据长度不等,是用空格分开若干个(不大于100个)正整数(不大于100000),请注意行内和行末可能有多余空格,你程序需要能处理这些空格。 每个整数代表个ID号。...输入格式   整数数组a[],数组元素个数小于1等于100。输出数据分作两行:第行只有个数,表示数组元素个数;第二行为数组各个元素。

31620

用人脑生成等概率随机,困扰人类30万年问题解决了 | 附“源代码”

如果用计算机,我们就可以生成近乎完全随机,保证每个数被抽中概率都是10%。(注:其实计算机生成是伪随机,并不完全随机,效果远胜过人类。) 在这件看似超级简单事情上,人脑输给了电脑。...怎么才能把人类随机函数变成真正随机函数,要做就是把概率分布大于10%挪到概率小于10%数上。 你可以想象成切碎这些长条并重新排列,让它们都样高: ?...人脑随机生成器 现在你明白人类随机生成器工作原理了,下面就是这套程序“源代码 向个人问得1~10之间随机整数n1; if n1=5 then 再向另一个人问得个随机整数n2;...if n1=7 then 再向另一个人问得个随机整数n2; if n2=2或5(概率20.7%) then 返回随机 1; if n2=8或9 (概率16.2%...再向另一个人问得个随机整数n2; if n2=2 (概率8.5%) then 返回随机 1; else 返回随机 8; else 返回随机 n1; 按照这个程序

62820

详解数组刷题上

移动零 给定个数组 nums,编写个函数将所有 0 移动到数组末尾,同时保持非零元素相对顺序。...移除元素 给定个数组 nums 和个值 val,你需要原地移除所有数值等于 val 元素,返回移除后数组新长度。...颜色分类 给定个包含红色、白色和蓝色,共 n 个元素数组,原地对它们进行排序,使得相同颜色元素相邻,并按照红色、白色、蓝色顺序排列。...两之和 II - 输入有序数组 给定个已按照升序排列 有序数组,找到两个数使得它们相加之和等于目标。...长度最小子数组 给定个含有 n 个正整数数组和个正整数 s ,找出该数组中满足其和≥ s 长度最小连续子数组。如果不存在符合条件连续子数组,返回 0。

60320

js数组排序几种方法

,直到数组长度小于或者等于1,这时候停止,这时候调用函数之后,传入个数组,就会自动返回数组排序之后新数组,这就是快速排序原理。...function sortArray(n1,n2){ return n1-n2; } 这个函数意思是:若 n1小于 n2,即 n1-n2 小于零,返回个小于零值,数组将按照升序排列。...function sortArray(n1,n2){ return n2-n1; } 这个函数意思是:若 n1 大于 n2, 即 n1n2 大于零,返回大于值,数组将按照降序排列...4、选择排序 选择排序原理就是选择出数组中最大或者是最小放到最前面,然后在次循环,选择次级最大或者最小,从而得到想要排序数组。...,从而使得最大或者最小元素次从前向后排列

4.3K30

“365算法每日学计划”:java语言基础题目及解答(06-10打卡)

“计划”时间安排:每周三和周六 ——说在前面 发表于2018-07-14思海同学 "算法每日学计划"06打卡: 问题描述   给定个长度为n数列,将这个数列按从小到大顺序排列。...说明分解质因数过程已经结束,打印出即可。...* (2)如果n>k,n能被k整除,则应打印出k值,并用n除以k商作为新正整数n,重复执行第步。 * (3)如果n不能被k整除,则用k+1作为k值,重复执行第步。...= k) { // 如果n>k,n能被k整除,则应打印出k值,并用n除以k商作为新正整数n if (j % k =...有两个因素会影响结果:乘客数目和乘客目的楼层。 思路:假设电梯现在停在第i层,i层以下的人有N1个,i层有N2个,i层以上的人有N3个,当前需要走楼梯为Y。

46920

2019年学习Python-day3作业

# 1、设计程序,要求能输入个值,然后赋值给age变量,判断age大小, # 如果大于等于18,打印"已成年",否则打印"未成年"。...3次数字,并赋值给变量 # 将3次输入数据转换为数字类型,然后把相加后值赋值给变量sum # 如果sum>100000, 输出"您输入个数和忒大了" # 如果sum>10000, 输出"您输入个数和挺大..." # 如果sum>1000, 输出"您输入个数和有点大" # 如果sum>100, 输出"您输入个数和不算大" # 如果sum<=100, 输出"您输入个数和忒小了" # 要求每次输入最终都只打印条语句...n1 = int(input('请输入第个数:')) n = input('请选择运算符号:') n2 = int(input('请输入第二个数:')) if my_choice == '+':...输入个有效年份,判断是不是闰年; # 如果是闰年,打印“***年是闰年”;否则打印“***年不是闰年”; # 如输入"2017",将打印“2017年不是闰年” year = input('请输入个有效年份

68830

力扣

排列排列 题目:实现获取 下排列 函数,算法需要将给定数字序列重新排列成字典序中下个更大排列如果不存在下个更大排列,则将数字重新排列最小排列(即升序排列)。...字母异位词指字母相同,排列不同字符串。...TopK问题 最小K个数 由于每次从堆顶弹出都是堆中最大最小 k 个元素定会留在堆里 public int[] getLeastNumbers(int[] arr, int k) {...数组中次数 多数元素(摩尔投票) 题目:给定个大小为 n 数组,找到其中多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 元素。...(都是向上寻找即可,因为下面的还没有放),如果满足条件,进行递归,继续找下行。

1.2K30

数据结构学习笔记(树、二叉树)

2.m>0时,子树个数没有限制,但它们定是互不相交。 结点分类: 结点拥有的子树称为结点度。度为0结点称为叶结点或终端结点;度不为0结点称为非终端结点或分支结点。...3.性质3:对任何棵二叉树T,如果其终端结点数为n0,度为2结点数为n2n0=n2+1。 4.性质4:具有n个结点完全二叉树深度为[log2n]+1 ([x]表示不大于x最大整数。...已知后序遍历序列和中序遍历序列,可以唯确定棵二叉树。 ##二叉树建立:建立二叉树,也是利用了递归原理。只不过在原来应该打印结点地方,改成了生成结点,给结点赋值操作而已。...2.取头两个最小权值结点作为个新节点N1两个子结点,注意相对较小是左孩子,这里就是A为N1左孩子,E为N1右孩子。...即:N115,B15,D30,C40. 4.重复步骤2.将N1与B作为个新节点N2两个子结点。N2权值=15+15=30。 5.将N2替换N1与B,插入有序序列中,保持从小到大排列

63830

排列生成算法:next_permutation

数学推导 根据上述概念易知,对于个任意序列,最小序列是增序,最大序列为减序。那么给定个pn要如何才能生成pn+1呢?...观察pn可以发现,其子序列已经为减序,那么这个子序列不可能通过交换元素位置得出更大序列了,因此必须移动最高位3(即a1)位置,且要在子序列中找个数来取代3位置。...子序列中6和4都比3大,6大于4。如果用6去替换3得到序列定会大于4替换3得到序列,因此只能选4。将4和3位置对调后形成排列。...<aqm),然后令n1=n-x(m-1)!,求这m-1个数中生成n1个序列第1位。 举例说明:如7个数集合为{1, 2, 3, 4, 5, 6, 7},要求出第n=1654个排列。...得2,确定第5为5,剩下2个数{1, 4};由于4 % 2!=0,故第6位和第7位为增序; 因此所有排列为:3267514。 2. 给定排列,如何算出这是第几个排列呢?

88160

百炼1006--Biorhythms

这样我们就把问题转化为求最小数,该除以T1余N1,除以T2余N2,除以T3余N3。这就是著名中国剩余定理,我们老祖宗在几千年前已经对这个问题想出了个精妙解法。...首先,我们假设n1是满足除以3余2个数,比如2,5,8等等,也就是满足3*k+2(k>=0)个任意。同样,我们假设n2是满足除以5余3个数,n3是满足除以7余2个数。...所以,孙子问题解法本质是从5和7公倍数中找个除以3余2n1,从3和7公倍数中找个除以5余3n2,从3和5公倍数中找个除以7余2n3,再将三个数相加得到解。...在求n1n2,n3时又用了个小技巧,以n1为例,并非从5和7公倍数中直接找个除以3余2,而是先找个除以3余1,再乘以2。...如果 a%b=c,那么 (a*k)%b=kc (k为大于整数)。

31720

2023-07-02:给定个1~N排列,每次将相邻两相加,可以得到新序列,长度是N-1 再对新序列,每次将相邻两相加

2023-07-02:给定个1~N排列,每次将相邻两相加,可以得到新序列,长度是N-1 再对新序列,每次将相邻两相加,可以得到新序列,长度是N-2 这样下去可以最终只剩个数字 比如 :...3 1 2 4 4 3 6 7 9 16 现在如果知道N,和最后数字sum,反推最原始序列是什么 如果有多个答案,返回字典序最小那个 字典序看做所有数字拼起来字符串字典序 比如 1, 10,...认为 1, 10, 2...字典序更小 如果给定n和sum,有答案,返回个N长度答案数组 如果给定n和sum,无答案,返回个1长度数组{ -1 } 输入 : N = 4, sum = 16...2.定义个变量status,其初始值为((1 << (n + 1)) - 1) ^ 1。 3.如果n小于1或大于10,或者sum大于sums[n],返回数组[-1]。...5.如果ans值为-1,说明无法找到合适序列,返回数组[-1]。 6.创建个长度为n答案数组ans,并初始化index为0,rest为sum。

22120

算法学习–分酒问题(BFS)

允许把酒从个瓶子倒入另一个瓶子,只能把个瓶子倒满或把个瓶子倒空,不能有中间状态。 这样次倒酒动作称为1次操作。...假设瓶子容量和初始状态不变,对于给定目标状态,至少需要多少次操作才能实现? 本题就是要求你编程实现最小操作次数计算。...输入:最终状态(空格分隔) 输出:最小操作次数(如无法实现,输出-1) 例如: 输入: 9 0 0 0 应该输出: 0 输入: 6 0 0 3 应该输出: -1 输入: 7 2 0...include using namespace std; //状态类 class state { public: string str;//目前状态 int step;//从原始状态到目前状态需要步骤..., n2, n3, n4; cin >> n1 >> n2 >> n3 >> n4; string str = to_string(n1) + to_string(n2) + to_string(n3)

33430

C++ 离散与组合数学之多重集合

元素与集合性质 确定性 :给定个集合,任给个元素,该元素属于或者不属于该集合,二者必居其不可能出现模棱两可情况。如1至5之间整数构成集合,即是{1,2,3,4,5}。...如有多重集:s={a1*a1,n2*a2……nk*ak} 。a1,a2,a3,……ak表示元素。n1,n2,……nk每个元素出现次数。ni可能是0,也可能是正无穷大。...多重集非全排列 所有元素重复度大于排列:如s={4*2,4*3,5*4,4*6}。从集合中选择r=4个数非全排列。注意,这里排列4小于、等于集合中重复度最小。...对于排列个位置都有k(为集合中元素个数)种选择。 根据乘法原理,总排列k*k*k*=kr。...某些元素重复度小于排列 如果个元素重复度小于选取个数 ,如 S = { 3*a,2*b,1*c}多重集排列 , 可以使用包含排斥原理 、生成函数进行计算 ; 4.

10710
领券