输出1,2,2,3,4,5的所有排列组合,4不能在第三位,3和5不能相邻------进来送分啦

yudylaw 2009-05-12 05:36:51

package yudylaw.java.sorted;

import java.util.ArrayList;

import java.util.List;
import java.util.Set;
import java.util.TreeSet;

/**
* 输出1,2,2,3,4,5的所有排列组合,4不能在第三位,3和5不能相邻
*
* 采用字符跟踪
* @author ****
* 10:56:38 PM Apr 23, 2009
*/
public class Sorted {

public static List<String> find(List<String> list) {
List<String> rtn = new ArrayList<String>();
String str;
for (int i = 0; i < list.size(); i++) {
str = list.get(i);
list.remove(i);
if (list.size() == 0) {
rtn.add(str);
} else {
List<String> sList = find(list);
for (String s : sList) {
rtn.add(str + s);
if (s.length() == 5) {
addNumber(str + s);
}
}
}
list.add(i, str);
}
return rtn;
}

/**
* 通过这个来排除
* @param str
*/
public static void addNumber(String str) {
if (str.charAt(2) == '4' || str.contains("35") || str.contains("53")) {
return;
}
set.add(str);
}

public static Set<String> set = new TreeSet<String>();

public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("1");
list.add("2");
list.add("2");
list.add("3");
list.add("4");
list.add("5");
find(list);
System.out.println(set.size());
int cols = 10;
for (String s : set) {
System.out.print(s + " ");
if (cols-- == 1) {
System.out.println();
cols = 10;
}
}
}
}



这个排序我不懂,谁能帮我分析下,有劳啦。
...全文
310 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
abc25485808 2009-05-17
  • 打赏
  • 举报
回复
jf
this_is_java 2009-05-17
  • 打赏
  • 举报
回复
很难啊
yudylaw 2009-05-16
  • 打赏
  • 举报
回复
Up
qsrock 2009-05-15
  • 打赏
  • 举报
回复
论坛上已经问过很多次了!
wangzhang1215 2009-05-15
  • 打赏
  • 举报
回复
逻辑思维要很强悍才行啊
LinuxAsianux 2009-05-14
  • 打赏
  • 举报
回复
数学上没有一定的功底是不行的啊
sweetBug 2009-05-14
  • 打赏
  • 举报
回复
其实与数学中的排列组合的思想是一致的,先从序列中选出一个来,然后以选出的这个字符打头,并从待排序的序列中移除已经选择的那个字符;
重复上个步骤,直致待排序的序列的长度为1;
然后将每次选择出来的打头字符加起来,并加上最后长度为1的序列.
qinlu7662032 2009-05-14
  • 打赏
  • 举报
回复
顶一个
swprogrammer 2009-05-13
  • 打赏
  • 举报
回复
可以去问下数学好的人,早点来看的,我会帮你解决,但现在夜深了。呵呵
一句话:先分析好了,把逻辑,然后再动笔,不是你会感觉有点乱,自己把自己弄晕了
yudylaw 2009-05-13
  • 打赏
  • 举报
回复
Up
Javaboot 2009-05-12
  • 打赏
  • 举报
回复
补充:最开始调用的find()不算是main()方法中调用的find()
Javaboot 2009-05-12
  • 打赏
  • 举报
回复
找由6个数字组成的组合,每个组合6个位置(从左道右排列,最左为第一位,最右为最后一位)
总共会有6层递归。
规定最开始调用的find()为最底层,也就是第一层。
设层数为n,从1开始到6,
(就单次连续的提取数字来说,n层循环次数为6-n+1次。)
每次循环分别从保留下来的数字字符中取出一个。
取出的一个字符相当于在这6个数字中选取一个放入待组合的第n位上。
又如下:
一层,二层,三,四,五

取1 , 取2 ,2 , 3, 4, 5 >> 到第五层获得"45"
以此类推
1,2,2,3,5,4 >> "54"
1,2,2,4,3,5 >> "35"
1,2,2,4,5,3 >> "53"
1,2,2,5,3,4 >> "34"
1,2,2,5,4,3 >> "43"

可见,下层down所有的find()执行完返回上层up一个集合,该集合包含down层针对up以及up前的取数方式所剩下数字的组合方式。只在第一层,也就是返回集合元素长度为5时才调用了addNumber(),组合成复合要求的6位数字组合。
huguang 2009-05-12
  • 打赏
  • 举报
回复
接分,学习学习
xnjnmn 2009-05-12
  • 打赏
  • 举报
回复
这个递归用的真是深,慢慢看先

67,513

社区成员

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

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