求数字或者字符串的全排列

以数字举例:有一个数组A的数为 :1 2 3 4 ,其按字典序列的全排列为:

1 2 3 4
1 3 2 4
1 3 4 2
1 4 2 3
1 4 3 2
2 1 3 4
2 1 4 3
2 3 4 1
……….

总共有 n!个排列,现在输入一个数K,输出其第K的排列

方法:采用康托编码的思想,其实就是求出每个位置上的数字:第一个位置的数字,第二个位置的数字。。。。

解法:按顺序求出每个位置上的数,这边假设 K=8 ;数组为:1 2 3 4 ,长度为4,位置p代表数组中第P个数:p=k/ (n-1)!
1、求第一个位置上的数,p代表第一个数在数组A中的位置

1)  p=8/(4-1)!=8/6=1; ---------->第一个数即  A[1]=2
 2) 把 A[1] 从数组A中去掉,剩下的数为:1 3 4
 3) k=k%(4-1)!=8%6=2

2、重复 步骤 1 的过程,求第二个位置上的数:

1)此时 k =2,数组A变为:1 3 4,数组的长度为3
 2)p=1/(3-1)!=2/2=1; ---------->第二个数即  A[1]=3
 3)把A[1]从数组A中去掉,剩下的数为:1 4
 4)k=k%(3-1)!=2%2=0

3、求第3个位置上的数,仍然重复步骤1 的过程:

1)此时K=0,循环结束;结束前,我们要把剩下的位置的数进行确定!
  其实很简单:无需任何操作,就是将数组A中剩下的元素按逆序输出:此时数组A中剩下的数字为:1、4;
  所以结果序列中第三个数 4,第四个数  1

循环结束的条件为:K=0

最后的结果:第 8 个序列是:2 3 4 1

代码:

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int getNjiecheng(int n){
     int res=1;
     for(int i=1;i<=n;i++){
          res*=i;
     }
     return res;
}
vector<int> getPermutationSequence(int k,vector<int> v){
     vector<int> res;
     int n=v.size();
     if(k>getNjiecheng(n))return res;
     while(k>0){
          int j=getNjiecheng(n-1);
          int p = k/j;
          k=k%j;
          if(k==0){
               p-=1;
               res.push_back(v[p]);
               vector<int>::iterator iter=v.begin()+p;
               v.erase(iter);
               reverse(v.begin(),v.end());
               for(int i=0;i<v.size();i++) res.push_back(v[i]);
               return res;
          }
          else{
               res.push_back(v[p]);
               vector<int>::iterator iter=v.begin()+p;
               v.erase(iter);
               n--;
          }
     }
}
int main(){
     vector<int> v;
     for(int i=1;i<=4;i++)
          v.push_back(i);
     vector<int> res=getPermutationSequence(24,v);
     for(vector<int>::iterator iter=res.begin();iter!=res.end();iter++){
          cout<<*iter<<"  ";
     }
     cout<<endl;
     return 0;
}

如果我们想得到 n!个全排列:只需循环 N! 次,调用getPermutationSequence(25,v);

for(int i=1;i<=N!;i++){
     getPermutationSequence(i,v);
}
时间: 2024-10-25 05:41:53

求数字或者字符串的全排列的相关文章

递归法求不重复字符串的全排列

我们可以将这个排列问题画成图形表示,即排列枚举树,比如下图为{1,2,3}的排列枚举树,此树和我们这里介绍的算法完全一致: 算法思路: (1)n个元素的全排列=(n-1个元素的全排列)+(另一个元素作为前缀): (2)出口:如果只有一个元素的全排列,则说明已经排完,则输出数组: (3)不断将每个元素放作第一个元素,然后将这个元素作为前缀,并将其余元素继续全排列,等到出口,出口出去后还需要还原数组: 引用自:http://blog.csdn.net/xiazdong/article/details

《编程之法》1.3字符串的全排列,组合,重复排列,八皇后问题

题目描述:输入一个字符串,打印出该字符串中字符的所有排列,例如输入"abc",输出"abc","acb","bac","bca","cab","cba" 解法一:递归实现 类似于图的深度遍历搜索求全路径的算法,每次交换两个数,并输出,按照递归的方法,如求abcd的全排序,1:先求abcd后面的bcd全排列(同样先求b后面cd的全排列,然后b与后面的元素依次交换);2:

字符串的全排列JAVA实现

package com.kpp; /** * 求字符串的全排列 * 递归的思想 * 比如 abcde 先求出abcd的全排列,然后将e分别插入全排列的5个位置 * a 全排列 a * ab 全排列 ab ba * abd 全排列即是 cab acb abc cba bca bac * * @author kpp * */ public class QuanPaiLie { /** * @param args */ public static void main(String[] args) {

算法笔记_025:字符串的全排列(Java)

目录 1 问题描述 2 解决方案 2.1 递归实现 2.2 字典序排列实现   1 问题描述 输入一个字符串,打印出该字符串的所有排列.例如,输入字符串"abc",则输出有字符'a','b','c'所能排列出来的所有字符串"abc","acb","bac","bca","cab","cba". 2 解决方案 2.1 递归实现 从字符串中选出一个字符作为排列的第一个字符

减治求有重复元素的全排列

求n个元素的全排列的所有解可以用减治法:每次拎出一个数做前缀,对剩下的元素再求全排列,直至只剩一个元素.代码源自<算法分析与设计(王晓东)>,复杂度O(n2) 1 //输出k~m的所有全排列 2 void perm(int k,int m) 3 { 4 if(k==m) 5 { 6 for(int i=0;i<=m;i++) 7 printf("%d ", list[i]); 8 printf("\n"); 9 }else 10 { 11 for(

28. 字符串的全排列之第2篇[string permutation with repeating chars]

[本文链接] http://www.cnblogs.com/hellogiser/p/string-permutation-with-repeating-chars.html [题目] 输入一个字符串,打印出该字符串中字符的所有排列.例如输入字符串abc,则输出由字符a.b.c所能排列出来的所有字符串abc.acb.bac.bca.cab和cba.例如输入字符串aba,则输出由字符a.b所能排列出来的所有字符串aab.aba.baa. [分析] 之前的博文28.字符串的排列之第1篇[String

python数字和字符串对象

一.python中的数字对象 数字是python当中使用比较广泛的数据类型. 1.数字对象类型 整形 int         如:1,2,3 浮点型 Float  如:1.0,2.0 长整形 long 在其他语言中超出指定范围的数叫做长整型 2147483647 python的指定数字只要给整数加L就算长整型 正因为2版本长整形的不严谨,python3版本取消了长整型 2.数字转换 a.通过函数转换类型 通过int(1L) 转换成整型,float(1) 转换成浮点型,long(1) 转换长整型

字符串数组全排列——逐个追加组合算法

我们在笔试面试过程中经常会遇到关于排列与组合的问题,其实这些可以通过递归简单的实现,看下面两个例子: (1)关于字符串排列的问题 输入一个字符串,打印出该字符串中字符的所有排列.例如输入字符串abc,则输出由字符a.b.c所能排列出来的所有字符串abc.acb.bac.bca.cab和cba. 可以这样想:固定第一个字符a,求后面两个字符bc的排列.当两个字符bc的排列求好之后,我们把第一个字符a和后面的b交换,得到bac;接着我们固定第一个字符b,求后面两个字符ac的排列.现在是把c放到第一位

python全栈学习总结二:数字、字符串、列表、元组、字典重要特点及方法

一 python中数据类型 整形:int 字符串:str 列表:list 元组:tuple 字典:dict 布尔值:bool 浮点型:float 一切皆对象,在python中,所有的数据类都是看做对象,故所有的类型名称都是类,通过类来建立对象,每个类中都有相应的方法,下面我们通过总结上面其中数据类型的特点以及常用的方法,来加深我们这些数据"类"的认识和理解. 二 各种数据类型总结 1 整形int 定义:age = 10 转换:value = int('158')  把字符串'158'转