请教一个算法的问题,先谢谢大家了

mjjzg 2009-11-06 10:27:26
例如:我输入123,则输出123、132、213、231、312、321,该如何写
可以先不考虑输入的数字有重复的,如果能解决输入的数字有重复的,更好。
多多提议,给个结果,谢了!
...全文
245 点赞 收藏 26
写回复
26 条回复
liguominz 2009年11月06日
mark~
回复 点赞
dongyang369 2009年11月06日
帮顶
回复 点赞
mjjzg 2009年11月06日
谁能写个出来,别都是理论一大堆,写一个试试就知道是否可行
回复 点赞
closewbq 2009年11月06日
这是和我的一个好友大bug学习的!

import java.util.ArrayList;
import java.util.Arrays;
public class Permutation {
public static void main(String[] args) {
String[] strs=permutation("12345");
System.out.println("全部排列的个数为:"+strs.length+"个");
System.out.println("全部排列的元素是:");
System.out.println(Arrays.toString(strs));
}

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;
}
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]);
}

}

结果:
全部排列的个数是:120个
全部排列的元素是:
[12354, 12534, 15234, 51234, 51243, 15243, 12543, 12453, 12435, 21435, 21453, 21543, 25143, 52143, 52134, 25134, 21534, 21354, 21345, 12345, 12354, 12534, 15234, 51234, 51243, 15243, 12543, 12453, 12435, 21435, 21453, 21543, 25143, 52143, 52134, 25134, 21534, 21354, 21345, 12345, 12354, 12534, 15234, 51234, 51243, 15243, 12543, 12453, 12435, 21435, 21453, 21543, 25143, 52143, 52134, 25134, 21534, 21354, 21345, 12345, 12354, 12534, 15234, 51234, 51243, 15243, 12543, 12453, 12435, 21435, 21453, 21543, 25143, 52143, 52134, 25134, 21534, 21354, 21345, 12345, 12354, 12534, 15234, 51234, 51243, 15243, 12543, 12453, 12435, 21435, 21453, 21543, 25143, 52143, 52134, 25134, 21534, 21354, 21345, 12345, 12354, 12534, 15234, 51234, 51243, 15243, 12543, 12453, 12435, 21435, 21453, 21543, 25143, 52143, 52134, 25134, 21534, 21354, 21345, 12345]
回复 点赞
closewbq 2009年11月06日
[Quote=引用 11 楼 closewbq 的回复:]
大哥标记。正在写!
[/Quote]
笔误,是打个标记
回复 点赞
closewbq 2009年11月06日
大哥标记。正在写!
回复 点赞
youjianbo_han_87 2009年11月06日
最笨的办法,全循环。

稍微改进下,可以用递归。
回复 点赞
KantChild 2009年11月06日
没说清楚:在步骤3,对新排列重复1,2
回复 点赞
lzh_me 2009年11月06日
up
回复 点赞
KantChild 2009年11月06日
用二叉树可以实现,描述下:
输入123,
1创建二叉树,1,2,3对应二叉树根节点,左,右子树根节点;
2先序遍历,后序遍历,得到两个排列;
3判断排列是否是新排列,如果是,保存起来,然后重复1,2,直到没有新排列结束。
4输出所有保存的排列
回复 点赞
asdfa23rdadsdfa 2009年11月06日
绑顶
回复 点赞
lihao1129 2009年11月06日
学C的时候 讲过的...
回复 点赞
casablancaliu 2009年11月06日
排列组合问题
回复 点赞
APOLLO_TS 2009年11月06日
递归全排列
回复 点赞
guodong66 2009年11月06日
可以使用双向链表实现,每次串一下。输出值。堆栈也可以。
回复 点赞
yellow0323 2009年11月06日
排列? N的阶层么
回复 点赞
haojia0716 2009年11月06日
错了错了 没有用栈 我把这个和另外一个算法搞混淆了 不好意思
但是我给的程序是正确的
回复 点赞
haojia0716 2009年11月06日
用栈实现的经典写法 完全符合你的要求


public class Arrangement {

public static void go(int[] data) {
go(data, new boolean[data.length], new int[data.length], 0);
}

public static void go(int[] data, boolean[] state, int[] flag, int p) {
print(p, data, flag);

for (int i = 0; i < data.length; i++) {
if (!state[i]) {
state[i] = true;
flag[p] = i; // 或者 flag[i] = p; 都可以
go(data, state, flag, p + 1);
state[i] = false;
}
}
}

public static void print(int p, int[] data, int[] flag) {
if (p >= data.length) {
for (int i = 0; i < data.length; i++) {
System.out.print(data[flag[i]] + " ");
}
System.out.println();
}
}

public static void main(String[] args) {
int[] data = { 1, 2, 3 };
go(data);
}
}




不知道你说的解决重复是什么意思.
如果是去重复数据,放到set里就行.
如果不用去,用我这个方法就行.
回复 点赞
panzhixiong 2009年11月06日
试试看吧 ,刚刚写的。
回复 点赞
panzhixiong 2009年11月06日
这个是用排列组合做的。代码简洁。应该符合你的要求 --->
package com.test;

public class test {
public static void main(String[] args) {
String s = "122345";
char[] c = s.toCharArray();
new test().zuhe(c, c.length, 0);
System.out.print("可能的组合数:" + kk);
}
static int kk = 0;
private void zuhe(char[] array, int n, int k) {
if (n == k) {
String str = new String(array);
System.out.println(str);
++kk;
} else {
for (int i = k; i < n; i++) {
swap(array, k, i);
zuhe(array, n, k + 1);
swap(array, i, k);
}
}
}
private void swap(char[] a, int x, int y) {
char temp = a[x];
a[x] = a[y];
a[y] = temp;
}
}
回复 点赞
发动态
发帖子
Java EE
创建于2007-09-28

3.7w+

社区成员

22.5w+

社区内容

J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区公告
暂无公告