17086 字典序的全排列,开发web应用

注意:

(1)字符串不含重复元素。

(2)这里初始输入的字串不一定是排列的有序集合中最小的那个,即使不是最小的那个,输出也一定要按照从小

到大的顺序输出。

输出格式

字典序的每个排列,按序号输出。

输入样例

3

214

输出样例

1 124

2 142

3 214

4 241

5 412

6 421

提示

这里两个办法来输出字典序的所有排列。

方法一:

可以用STL的next_permutation()函数,标准库全排列next_permutation()的返回值:

bool类型。

假设数列:d1d2d3d4…… 范围由[first,last)标记,调用next_permutation使数列

逐次增大,这个递增过程按照字典序。

C++ Reference中next_permutation的函数声明如下:

#include

bool next_permutation( iterator start, iterator end );

The next_permutation() function attempts to transform the given range

of elements [start,end) into the next lexicographically greater permutation

of elements. If it succeeds, it returns true, otherwise, it returns false.

所以,将输入的数字序列用sort()或qsort()排下序,先找到最小的字典序排列,然后不断

调用next_permutation() 并输出,直至最后最大的一个。

方法二:思路同方法一,但自行编写计算一个当前字符串的下一个字典序排列。

设P是一个排列串:P = s[1]s[2]…s[n] = s[1]…s[j]…s[k]…s[n]

1)从当前排列串的右端开始,找出第一个比右边数字小的数字的序号j

(j从左端开始计算),即 j=max{i|s[i]<s[i+1]};

2)在s[j]的右边的数字中,找出所有比s[j]大的数中最小的数字s[k],

即 k=max{i|s[i]>s[j]}

(对s[j]右边数来说,从右至左是递增的,因此k是所有大于s[j]的数字中序号最大者,

序号虽最大但s[k]是处于s[j]右边且比s[j]大的数中的最小者);

3)交换s[j]和s[k];

4)再将s[j+1]…s[k-1]s[k]s[k+1]…s[n]倒转得到排列

P’ = s[1]s[2]…s[j]s[n]…s[k+1]s[k]s[k-1]…s[j+1],

这里P’就是排列P的下一个排列。

简单来说,就是对于给定的一个数,首先从右边找到第一个相邻“有序对”(这个“有序对”

的定义是就是满足s[i]<s[i+1]最右边对)。

现假设下一个要找的数比这个数大,且中间没有一个数比前者大、比后者小。然后再重新从

右边起找出第一个比那个"有序对"的较小者要大的数,交换他们,再将那个较小数下标后面的

子数组反转。

总结一下:就是由后向前找替换数和替换点,然后由后向前找第一个比替换数大的数与替换数

交换,最后颠倒替换点后的所有数据。

不知道这样写,大家看懂了没有?

作者 zhengchan

Version: 0

#include<stdio.h>

using namespace std;

const int N =105;

int n,m;

int a[N];

char temp;

int number;

int buf;

int Count=0;

void out()

{

printf("%d ",++Count);

for(int i=1; i<=n; i++)

{

printf(“%d”,a[i]);

}

puts(“”);

}

void swap(int& a,int& b)

{

int tmp = a;

a=b;

b=tmp;

}

void rev(int left,int right)

{

while(left<=right)

{

swap(a[left],a[right]);

left++,right–;

}

}

bool change()

{

int j=n-1;
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)

最后

技术是没有终点的,也是学不完的,最重要的是活着、不秃。零基础入门的时候看书还是看视频,我觉得成年人,何必做选择题呢,两个都要。喜欢看书就看书,喜欢看视频就看视频。最重要的是在自学的过程中,一定不要眼高手低,要实战,把学到的技术投入到项目当中,解决问题,之后进一步锤炼自己的技术。

技术学到手后,就要开始准备面试了,找工作的时候一定要好好准备简历,毕竟简历是找工作的敲门砖,还有就是要多做面试题,复习巩固。有需要面试题资料的朋友点击这里可以免费领取


喜欢看书就看书,喜欢看视频就看视频。最重要的是在自学的过程中,一定不要眼高手低,要实战,把学到的技术投入到项目当中,解决问题,之后进一步锤炼自己的技术。

技术学到手后,就要开始准备面试了,找工作的时候一定要好好准备简历,毕竟简历是找工作的敲门砖,还有就是要多做面试题,复习巩固。有需要面试题资料的朋友点击这里可以免费领取

[外链图片转存中…(img-dwrpHz9B-1712074820038)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值