问题描述如下:
“1,2,3的全排列是123 132 213 231 312 321,其全排列第3个的值为213,求{0,1,2,3,4,5,6,7,8,9}的全排列的第1000000个的值?”
我们可以知道{0,1,2,3,4,5,6,7,8,9}的全排列有10!个,如果要给出所有的全排列,那么昨天所说的Jhonson Trotter算法是比较高效的。在文章最后会给出其代码,有兴趣可以瞧瞧。
就本题而言,要确定每一位的值,从0开始的数有9!个,1...9开头的排列也一样,那第一个数就可以确定为999999/9!=2,第二个数就为(999999-999999/9!)/8!,由此类推,可以得到最终的数字,不说了,给代码:
/**
* 给出集合{0,1,2,3,4,5,6,7,8,9}的全排列从小到大的第1000000个的值
*
* @return
*/
public static String getNumber() {
int[] factorial = { 1, 2, 6, 24, 120, 720, 5040, 40320, 362880 };
// 1!,2!,...,9!
String s = "0123456789";
int limit = 999999;
String result = "";
for (int i = factorial.length - 1; i >= 0; i--) {
// 取剩下字符串的第几位
int num = limit / factorial[i];
result += s.charAt(num);
limit = limit - num * factorial[i];
// 把确定的数从字符串中移取
s = remainNumber(s, num);
}
return result + s;
}
// 确定一位后,剩下的数
private static String remainNumber(String s, int index) {
return s.substring(0, index) + s.substring(index + 1);
}
下面给出的是Jhonson Trotter算法的java实现(从网上直接找的),如果不明白可以直接问我:
/**
* Johnson-trotter 算法
*
* @param str
* @return
*/
public static String[] permutation(String str) {
ArrayList<String> myList = new ArrayList<String>();
char[] strChars = str.toCharArray();
char temp;
long times = 1;
int pos = strChars.length - 2;
int increment = -1;
for (int i = 1; i < strChars.length + 1; i++) {
times *= i;// (strChars.length + 1)!
}
for (int i = 1; i < times; i++) {
temp = strChars[pos];
strChars[pos] = strChars[pos + 1];
strChars[pos + 1] = temp;
myList.add(new String(strChars));
pos += increment;
if (pos == -1) {
increment = 1;
pos = 0;
temp = strChars[strChars.length - 2];
strChars[strChars.length - 2] = strChars[strChars.length - 1];
strChars[strChars.length - 1] = temp;
myList.add(new String(strChars));
i++;
} else if (pos == strChars.length - 1) {
increment = -1;
pos = strChars.length - 2;
temp = strChars[0];
strChars[0] = strChars[1];
strChars[1] = temp;
myList.add(new String(strChars));
i++;
}
}
return myList.toArray(new String[0]);
}
到此结束。
请不吝赐教。
@anthor ClumsyBirdZ
分享到:
相关推荐
在计算机科学中,全排列是一个非常重要的概念,它指的是将一个集合中的元素按照一定的顺序排列出来的所有可能的排列方式。在这个文件中,我们将讨论CC++中生成从1到n的全排列算法,以及字符串的全排列算法。 一、...
2. **选定3作为第一位**:固定3,对剩余元素{1, 5, 9}进行全排列,得到{3, 1, 5, 9}、{3, 1, 9, 5}等。 3. **继续此过程**,直到所有元素都被选定过为止。 #### 4. 从第m个元素到第n个元素的全排列的算法 从序列中...
全排列是一种经典的算法问题,它涉及在给定的有限序列中找出所有可能的元素排列方式。在本例中,我们关注的是非递归算法来实现全排列,这通常使用回溯法或者迭代的方式来完成,特别是在有新元素动态加入时,需要能够...
根据给定文件的信息,本文将深入探讨如何使用回溯法来输出自然数1到n的所有不重复排列(即n的全排列)。同时,还将提供一个Java实现的具体示例。 ### 回溯法简介 回溯法是一种通过尝试解决离散和组合问题的方法,...
例如,对于集合{1,2,3},其全排列有6种:(1,2,3),(1,3,2),(2,1,3),(2,3,1),(3,1,2),(3,2,1)。 ### C++全排列源代码分析 #### 1. **程序结构** 程序首先包含了必要的头文件`"stdafx.h"`和`"iostream.h"`,这...
集X中元素的全排列记为Perm(X),(ri)Perm(X)表示在全排列Perm(X)的每一个排列前加上前缀ri得到的排列.R的全排列可归纳定义如下: 当n=1时,Perm(R)={r},r是集合R中唯一的元素. 当n>1时,Perm(R)由(r1)Perm(R1),(r2)...
- 部分内容中的 "C(14 - 1, 2 - 1) - 3 · C(6 - 1, 3 - 1)" 是组合计数的表达式,计算的是从14个不同元素中取1个的组合数减去从6个元素中取3个的组合数的3倍。这里使用了组合公式 C(n, k) = n!/k!(n-k)!。 - 计算...
例如,对于序列{1,2,3},它的全排列包括{1,2,3},{1,3,2},{2,1,3},{2,3,1},{3,1,2},{3,2,1}。 以下是使用C++实现回溯法求序列全排列的步骤: 1. 定义一个递归函数,接收当前处理到的元素索引和剩余未处理的元素...
例如,对于序列[1,2,3],全排列II的结果是[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]],而全排列I的结果则会包含重复的[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1],[2,1,3],[2,3,1]]。 解题思路通常...
这确保了即使在输入格式错误或文件读写出现问题时,程序也能优雅地给出错误提示并终止执行,避免了程序崩溃或产生误导性结果。 #### 总结 重复元素全排列算法是计算机科学中一个有趣且实用的课题,它不仅考验着...
例如,对于集合{1, 2, 3, 4},全排列包括{1, 2, 3, 4}, {1, 2, 4, 3}, {1, 3, 2, 4}等。实现全排列的常见方法是回溯法,即递归地尝试所有可能的选择。在代码中,`print`函数就是通过设置一个布尔数组`flag`来标记...
在这个问题中,我们通常要找出一个给定大小的集合的所有可能的排列方式。例如,对于数字1到n,全排列就是所有可能的n个数字的排列组合。在本例中,我们将深入探讨如何使用深度优先搜索(DFS)解决全排列问题。 深度...
例如,对于数字1、2和3,全排列有{1, 2, 3}, {1, 3, 2}, {2, 1, 3}, {2, 3, 1}, {3, 1, 2} 和 {3, 2, 1}。在Java中,全排列通常通过递归实现,配合回溯算法来避免重复计算。 回溯算法是一种“走一步,退一步”的...
在 N 位的 10 进制数中,每个位上的数都可以在 0,...,9 之间的一个数字中选取,第 n 位的数的基数为 10n-1。我们可以通过变化每位上的数字来遍历 0 到 10N-1 之间的每个数。 类似地,我们可以把前面步骤中的每个...
当给定一个包含N个不同元素的集合时,全排列就是要列出所有可能的N!(N的阶乘)种排列方式。在这个场景中,我们将探讨如何使用Java语言,通过回溯法来递归实现全排列的输出。 首先,我们需要理解回溯法的基本概念。...
例如,如果输入的数字集合是[1, 2, 3],所有可能的排列就是[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], 和 [3, 2, 1]。这个问题可以通过回溯算法解决,因为它涉及到在一个有限的空间内寻找所有可能的...
在本场景中,我们以铁路车厢的排列为例,探讨如何设计一个程序来生成所有长度为4的车厢序列,比如1,2,3,4的全排列。全排列算法在数据结构和算法课程设计中是一项常见的任务,它可以帮助学生理解递归和回溯等概念...
- **路径规划**:在旅行商问题(TSP)中,全排列可以用来找出最短的访问每个城市一次并返回起点的路径。 - **模式识别**:在图像和语音识别中,全排列可以帮助分析和匹配特征。 ### 总结 全排列算法是组合数学中的一...
全排列算法是计算机科学中的一种经典算法,主要应用于解决如何生成一个给定集合的所有可能排列的问题。在给定的题目中,作者通过一个简单的递归方法实现了全排列的计算。以下是对该算法的详细解析: 首先,我们来看...
在计算机科学中,全排列是指对一个集合中的所有元素进行排列的操作。全排列算法是一种常用的算法,用于生成所有可能的排列方式。在C#中,可以使用递归或迭代的方式来实现全排列算法。 在给定的代码中,我们可以看到...