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

mjjzg 2009-11-06 10:27:26
例如:我输入123,则输出123、132、213、231、312、321,该如何写
可以先不考虑输入的数字有重复的,如果能解决输入的数字有重复的,更好。
多多提议,给个结果,谢了!
...全文
473 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
liguominz 2009-11-06
  • 打赏
  • 举报
回复
mark~
97095639 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输出所有保存的排列
「已注销」 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;
}
}
加载更多回复(6)

67,535

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧