他要求的是不重复选择吧(这里存在两个2,分别算的)private int[] num = new int[]{1,2,2,3,4,5}; private boolean[] selected = null; public static void main(String[] args) throws Exception { new Test().test(); } private void test() { selected = new boolean[num.length]; List<Integer> result = new ArrayList<Integer>(); next(result); }private void next(List<Integer> result) { if(result.size() == num.length) printResult(result); else { for(int i = 0; i < num.length; i++) { if(!selected[i]) { selected[i] = true; result.add(num[i]); next(result); result.remove(result.size() - 1); selected[i] = false; } } } } private void printResult(List<Integer> result) { if(result.get(2).intValue() != 4) { for(int i = 1; i < result.size(); i++) if(result.get(i - 1).intValue() == 3 && result.get(i).intValue() == 5) return; for(int i = 0; i < result.size(); i++) System.out.print(result.get(i)); System.out.println(); } }
我的解法,共计耗时90分钟...... 思考、论证字典序法是否适用耗时65分钟,编码调试25分钟package org;public class PaiLie { // 检查排列值是否符合试题中的条件 private boolean testValues(int[] buf) { // 检查4是否在第3位 if (buf[2] == 4 /* 4在第3位 */) return false; // 检查3、5是否相连 for (int i = 0; i < buf.length - 1; i++) { if ((buf[i] == 3 && buf[i + 1] == 5) || (buf[i] == 5 && buf[i + 1] == 3)) return false; } return true; } // 输出 private void print(int[] buf) { for (int i = 0; i < buf.length; i++) { System.out.print(buf[i] + " "); } System.out.println(); } // //////////////////////////////////////////////////////////////////// // 字典法 // 是否应该考虑使用Comparable接口的数组?! private void dict(int[] buf) { int count = 0; // 计数器 // 初始化排列元,将字典元按由小到大排列,此时,buf中为全排列中的最小值 for (int i = 0; i < buf.length - 1; i++) { for (int j = i + 1; j < buf.length; j++) { if (buf[i] > buf[j]) { int x = buf[i]; buf[i] = buf[j]; buf[j] = x; } } } // 按字典排序遍历所有的排列值,符合条件的输出 int[] next = buf; do { if (testValues(next)) { count++; print(next); } next = findNext(next);// 找全排列中的下一个排列值 } while (next != null); System.out.println(count); } // 查找字典法中当前排列值的下一个排列值 private int[] findNext(int[] buf) { // 自右向左扫描,找到第一个下降点 int lowerPoint = -1; // 记录下降点 for (int i = buf.length - 1; i > 0; i--) { if (buf[i] > buf[i - 1]) { lowerPoint = i - 1; break; } } if (lowerPoint >= 0) { int[] temp = new int[buf.length]; System.arraycopy(buf, 0, temp, 0, buf.length);// 拷贝前缀 // 找下一个进位值,并于下降位交换 int stardard = buf[lowerPoint]; int next = Integer.MAX_VALUE; int pos = 0; for (int i = lowerPoint + 1; i < buf.length; i++) { if (buf[i] > stardard && next > buf[i]) { next = buf[i]; pos = i; } } temp[lowerPoint] = next; temp[pos] = stardard; // 对后缀排序,找到最小后缀 for (int i = lowerPoint + 1; i < buf.length - 1; i++) { for (int j = i + 1; j < buf.length; j++) { if (temp[i] > temp[j]) { int x = temp[i]; temp[i] = temp[j]; temp[j] = x; } } } return temp; } else // 没有下降点时说明已经是最大排列值了 return null; } // //////////////////////////////////////////////////////////////////////////// // //////////////////////////////////////////////////////////////////////////// public static void main(String[] args) { int[] array = new int[] { 1, 2, 2, 3, 4, 5 }; PaiLie pl = new PaiLie(); pl.dict(array); //pl.emnu(array);// 尚未实现 } }
看见大家循环套循环,圈圈套圈圈的写法,我实在是忍无可忍了,6个数字还好,给你一百个数字,是不是准备百环大作战了? 我来实现一下我之前讲的基本思路: 1 把问题归结为图结构的遍历问题。实际上6个数字就是六个结点,把六个结点连接成无向连通图,对于每一个结点求这个图形的遍历路径,所有结点的遍历路径就是最后对这6个数字的排列组合结果集。 2 显然这个结果集还未达到题目的要求。从以下几个方面考虑: 1. 3,5不能相连:实际要求这个连通图的结点3,5之间不能连通, 可在构造图结构时就满足改条件,然后再遍历图。 2. 不能有重复: 考虑到有两个2,明显会存在重复结果,可以把结果集放在TreeSet中过滤重复结果 3. 4不能在第三位: 仍旧在结果集中去除满足此条件的结果。采用二维数组定义图结构,最后的代码是:import java.util.Iterator; import java.util.TreeSet;public class TestQuestion {private String[] b = new String[]{"1", "2", "2", "3", "4", "5"}; private int n = b.length; private boolean[] visited = new boolean[n]; private int[][] a = new int[n][n]; private String result = ""; private TreeSet set = new TreeSet();public static void main(String[] args) { new TestQuestion().start(); }private void start() {// Initial the map a[][] for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (i == j) { a[i][j] = 0; } else { a[i][j] = 1; } } }// 3 and 5 can not be the neighbor. a[3][5] = 0; a[5][3] = 0;// Begin to depth search. for (int i = 0; i < n; i++) { this.depthFirstSearch(i); }// Print result treeset. Iterator it = set.iterator(); while (it.hasNext()) { String string = (String) it.next(); // "4" can not be the third position. if (string.indexOf("4") != 2) { System.out.println(string); } } }private void depthFirstSearch(int startIndex) { visited[startIndex] = true; result = result + b[startIndex]; if (result.length() == n) { // Filt the duplicate value. set.add(result); } for(int j = 0; j < n; j++) { if (a[startIndex][j] == 1 && visited[j] == false) { depthFirstSearch(j); } else { continue; } }// restore the result value and visited value after listing a node. result = result.substring(0, result.length() -1); visited[startIndex] = false; } }可以结贴了。
public class Test { /** * @param args */ public static void f() { String s; int ii = 0; int[] a = { 1, 2, 2, 3, 4, 5, 6 }; int[] b = { 1, 2, 2, 3, 4, 5, 6 }; for (int i0 = 0; i0 < 6; i0++) { // b = null; b[0] = a[i0]; for (int i1 = 0; i1 < 7; i1++) { if (i1 == 7) break; if (i1 == i0) continue; b[1] = a[i1]; for (int i2 = 0; i2 < 7; i2++) { if (i1 == 7) break; if (i2 == i0 || i2 == i1) continue; b[2] = a[i2]; for (int i3 = 0; i3 < 7; i3++) { if (i3 == 7) break; if (i3 == i0 || i3 == i1 || i3 == i2) continue; b[3] = a[i3]; for (int i4 = 0; i4 < 7; i4++) { if (i4 == 7) break; if (i4 == i0 || i4 == i1 || i4 == i2 || i4 == i3) continue; b[4] = a[i4]; for (int i5 = 0; i5 < 7; i5++) { if (i5 == 7) break; if (i5 == i0 || i5 == i1 || i5 == i2 || i5 == i3 || i5 == i4) continue; b[5] = a[i5]; s = null; // for (int b1 = 0; b1 < 6; b1++) { s = "" + b[0] + b[1] + b[2] + b[3] + b[4] + b[5]; // } int index = s.indexOf('3'); if (index < 5 && b[index + 1] == 5) continue; int ind = s.indexOf('5'); if (ind < 5 && b[ind + 1] == 3) continue; // continue; if (b[2] != 4 && s.indexOf('6') == -1) { System.out.println(s + "----" + ++ii); } else { continue; } } } } } } } } public static void main(String[] args) { // TODO Auto-generated method stub Test.f(); // Test.g(); System.out.println("122345".indexOf('5')); }} 我利用上午的一些时间写的,请指教
// a 为 1 2 3 4 5; b 开始为"" private static void PrintInt(ArrayList<Integer> a, String b) { // b="" if (a.size() ==1){ System.out.print(b + a.get(0) + "\t"); return; }else { for (int i=0; i< a.size(); i++){ String temp_b=b; temp_b+=a.get(i); ArrayList<Integer> temp =(ArrayList<Integer>)a.clone(); temp.remove(i); PrintInt(temp, temp_b); } }
}
我想可以写成递归的...乱写了一下...可以满足楼主的要求哦import java.util.ArrayList;public class JavaLiu { public static void main(String[] args) { String str1, str2, str3, str4, str5, str6; ArrayList list = new ArrayList(); list.add("1"); list.add("2"); list.add("2"); list.add("3"); list.add("4"); list.add("5"); ArrayList list1, list2, list3, list4, list5, list6; for (int a = 0; a < 6; a++) { list1 = (ArrayList) list.clone(); str1 = (String) list1.get(a); for (int b = 0; b < 5; b++) { list2 = (ArrayList) list1.clone(); list2.remove(a); str2 = str1 + list2.get(b); for (int c = 0; c < 4; c++) { list3 = (ArrayList) list2.clone(); list3.remove(b); str3 = str2 + list3.get(c); for (int d = 0; d < 3; d++) { list4 = (ArrayList) list3.clone(); list4.remove(c); str4 = str3 + list4.get(d); for (int e = 0; e < 2; e++) { list5 = (ArrayList) list4.clone(); list5.remove(d); str5 = str4 + list5.get(e); list6 = (ArrayList) list5.clone(); list6.remove(e); str6 = str5 + list6.get(0); if (str6.charAt(2) != '4' && str6.indexOf("35") == (-1)) { System.out.println(str6); } } } } } } } }
import java.util.ArrayList;public class JavaLiu { public static void main(String[] args) { String str1, str2, str3, str4, str5, str6; ArrayList list = new ArrayList(); list.add("1"); list.add("2"); list.add("2"); list.add("3"); list.add("4"); list.add("5"); ArrayList list1, list2, list3, list4, list5, list6; for (int a = 0; a < 6; a++) { list1 = (ArrayList) list.clone(); str1 = (String) list1.get(a); for (int b = 0; b < 5; b++) { list2 = (ArrayList) list1.clone(); list2.remove(a); str2 = str1 + list2.get(b); for (int c = 0; c < 4; c++) { list3 = (ArrayList) list2.clone(); list3.remove(b); str3 = str2 + list3.get(c); for (int d = 0; d < 3; d++) { list4 = (ArrayList) list3.clone(); list4.remove(c); str4 = str3 + list4.get(d); for (int e = 0; e < 2; e++) { list5 = (ArrayList) list4.clone(); list5.remove(d); str5 = str4 + list5.get(e); list6 = (ArrayList) list5.clone(); list6.remove(e); str6 = str5 + list6.get(0); if (str6.charAt(2) != '4' && str6.indexOf("35") == (-1)) { System.out.println(str6); } } } } } } } }
成功写出递归..嘻嘻import java.util.ArrayList;public class Sunkist { private static void Windsorr(String str2, ArrayList list2) { String str = str2.toString(); ArrayList list = (ArrayList) list2.clone(); if (list.size() == 1) { str = str + list.get(0); if (str.charAt(2) != '4' && str.indexOf("35") == (-1)) { System.out.println(str); } } else { for (int i = 0; i < list.size(); i++) { str = str + list.get(i); list.remove(i); Windsorr(str, list); str = str2.toString(); list = (ArrayList) list2.clone(); } } }public static void main(String[] args) { String str = ""; ArrayList list = new ArrayList(); list.add("1"); list.add("2"); list.add("2"); list.add("3"); list.add("4"); list.add("5");Windsorr(str, list); } }
private boolean[] selected = null;
public static void main(String[] args) throws Exception {
new Test().test();
}
private void test() {
selected = new boolean[num.length];
List<Integer> result = new ArrayList<Integer>();
next(result);
}private void next(List<Integer> result) {
if(result.size() == num.length)
printResult(result);
else {
for(int i = 0; i < num.length; i++) {
if(!selected[i]) {
selected[i] = true;
result.add(num[i]);
next(result);
result.remove(result.size() - 1);
selected[i] = false;
}
}
}
}
private void printResult(List<Integer> result) {
if(result.get(2).intValue() != 4) {
for(int i = 1; i < result.size(); i++)
if(result.get(i - 1).intValue() == 3 && result.get(i).intValue() == 5)
return;
for(int i = 0; i < result.size(); i++)
System.out.print(result.get(i));
System.out.println();
}
}
思考、论证字典序法是否适用耗时65分钟,编码调试25分钟package org;public class PaiLie { // 检查排列值是否符合试题中的条件
private boolean testValues(int[] buf) {
// 检查4是否在第3位
if (buf[2] == 4 /* 4在第3位 */) return false; // 检查3、5是否相连
for (int i = 0; i < buf.length - 1; i++) {
if ((buf[i] == 3 && buf[i + 1] == 5)
|| (buf[i] == 5 && buf[i + 1] == 3)) return false; }
return true; }
// 输出
private void print(int[] buf) {
for (int i = 0; i < buf.length; i++) {
System.out.print(buf[i] + " ");
}
System.out.println();
}
// ////////////////////////////////////////////////////////////////////
// 字典法 // 是否应该考虑使用Comparable接口的数组?!
private void dict(int[] buf) {
int count = 0; // 计数器 // 初始化排列元,将字典元按由小到大排列,此时,buf中为全排列中的最小值
for (int i = 0; i < buf.length - 1; i++) {
for (int j = i + 1; j < buf.length; j++) {
if (buf[i] > buf[j]) {
int x = buf[i];
buf[i] = buf[j];
buf[j] = x;
}
}
} // 按字典排序遍历所有的排列值,符合条件的输出
int[] next = buf;
do {
if (testValues(next)) {
count++;
print(next);
}
next = findNext(next);// 找全排列中的下一个排列值
} while (next != null); System.out.println(count); }
// 查找字典法中当前排列值的下一个排列值
private int[] findNext(int[] buf) { // 自右向左扫描,找到第一个下降点
int lowerPoint = -1; // 记录下降点
for (int i = buf.length - 1; i > 0; i--) {
if (buf[i] > buf[i - 1]) {
lowerPoint = i - 1;
break;
}
} if (lowerPoint >= 0) {
int[] temp = new int[buf.length];
System.arraycopy(buf, 0, temp, 0, buf.length);// 拷贝前缀 // 找下一个进位值,并于下降位交换
int stardard = buf[lowerPoint];
int next = Integer.MAX_VALUE;
int pos = 0;
for (int i = lowerPoint + 1; i < buf.length; i++) {
if (buf[i] > stardard && next > buf[i]) {
next = buf[i];
pos = i;
}
} temp[lowerPoint] = next;
temp[pos] = stardard; // 对后缀排序,找到最小后缀
for (int i = lowerPoint + 1; i < buf.length - 1; i++) {
for (int j = i + 1; j < buf.length; j++) {
if (temp[i] > temp[j]) {
int x = temp[i];
temp[i] = temp[j];
temp[j] = x;
}
}
} return temp; } else
// 没有下降点时说明已经是最大排列值了
return null;
}
// ////////////////////////////////////////////////////////////////////////////
// //////////////////////////////////////////////////////////////////////////// public static void main(String[] args) {
int[] array = new int[] { 1, 2, 2, 3, 4, 5 };
PaiLie pl = new PaiLie();
pl.dict(array);
//pl.emnu(array);// 尚未实现
}
}
我来实现一下我之前讲的基本思路:
1 把问题归结为图结构的遍历问题。实际上6个数字就是六个结点,把六个结点连接成无向连通图,对于每一个结点求这个图形的遍历路径,所有结点的遍历路径就是最后对这6个数字的排列组合结果集。
2 显然这个结果集还未达到题目的要求。从以下几个方面考虑:
1. 3,5不能相连:实际要求这个连通图的结点3,5之间不能连通, 可在构造图结构时就满足改条件,然后再遍历图。
2. 不能有重复: 考虑到有两个2,明显会存在重复结果,可以把结果集放在TreeSet中过滤重复结果
3. 4不能在第三位: 仍旧在结果集中去除满足此条件的结果。采用二维数组定义图结构,最后的代码是:import java.util.Iterator;
import java.util.TreeSet;public class TestQuestion {private String[] b = new String[]{"1", "2", "2", "3", "4", "5"};
private int n = b.length;
private boolean[] visited = new boolean[n];
private int[][] a = new int[n][n];
private String result = "";
private TreeSet set = new TreeSet();public static void main(String[] args) {
new TestQuestion().start();
}private void start() {// Initial the map a[][]
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (i == j) {
a[i][j] = 0;
} else {
a[i][j] = 1;
}
}
}// 3 and 5 can not be the neighbor.
a[3][5] = 0;
a[5][3] = 0;// Begin to depth search.
for (int i = 0; i < n; i++) {
this.depthFirstSearch(i);
}// Print result treeset.
Iterator it = set.iterator();
while (it.hasNext()) {
String string = (String) it.next();
// "4" can not be the third position.
if (string.indexOf("4") != 2) {
System.out.println(string);
}
}
}private void depthFirstSearch(int startIndex) {
visited[startIndex] = true;
result = result + b[startIndex];
if (result.length() == n) {
// Filt the duplicate value.
set.add(result);
}
for(int j = 0; j < n; j++) {
if (a[startIndex][j] == 1 && visited[j] == false) {
depthFirstSearch(j);
} else {
continue;
}
}// restore the result value and visited value after listing a node.
result = result.substring(0, result.length() -1);
visited[startIndex] = false;
}
}可以结贴了。
* @param args
*/
public static void f() {
String s;
int ii = 0;
int[] a = { 1, 2, 2, 3, 4, 5, 6 };
int[] b = { 1, 2, 2, 3, 4, 5, 6 };
for (int i0 = 0; i0 < 6; i0++) {
// b = null;
b[0] = a[i0];
for (int i1 = 0; i1 < 7; i1++) {
if (i1 == 7)
break;
if (i1 == i0)
continue;
b[1] = a[i1];
for (int i2 = 0; i2 < 7; i2++) {
if (i1 == 7)
break;
if (i2 == i0 || i2 == i1)
continue;
b[2] = a[i2];
for (int i3 = 0; i3 < 7; i3++) {
if (i3 == 7)
break;
if (i3 == i0 || i3 == i1 || i3 == i2)
continue;
b[3] = a[i3];
for (int i4 = 0; i4 < 7; i4++) {
if (i4 == 7)
break;
if (i4 == i0 || i4 == i1 || i4 == i2 || i4 == i3)
continue;
b[4] = a[i4];
for (int i5 = 0; i5 < 7; i5++) {
if (i5 == 7)
break;
if (i5 == i0 || i5 == i1 || i5 == i2
|| i5 == i3 || i5 == i4)
continue;
b[5] = a[i5];
s = null;
// for (int b1 = 0; b1 < 6; b1++) {
s = "" + b[0] + b[1] + b[2] + b[3] + b[4]
+ b[5];
// }
int index = s.indexOf('3');
if (index < 5 && b[index + 1] == 5)
continue; int ind = s.indexOf('5');
if (ind < 5 && b[ind + 1] == 3)
continue;
// continue; if (b[2] != 4 && s.indexOf('6') == -1) {
System.out.println(s + "----" + ++ii);
} else {
continue;
}
} }
}
}
}
}
} public static void main(String[] args) {
// TODO Auto-generated method stub
Test.f();
// Test.g();
System.out.println("122345".indexOf('5'));
}}
我利用上午的一些时间写的,请指教
private static void PrintInt(ArrayList<Integer> a, String b) { // b=""
if (a.size() ==1){
System.out.print(b + a.get(0) + "\t");
return;
}else {
for (int i=0; i< a.size(); i++){
String temp_b=b;
temp_b+=a.get(i);
ArrayList<Integer> temp =(ArrayList<Integer>)a.clone();
temp.remove(i);
PrintInt(temp, temp_b);
}
}
}
public static void main(String[] args) {
String str1, str2, str3, str4, str5, str6;
ArrayList list = new ArrayList();
list.add("1");
list.add("2");
list.add("2");
list.add("3");
list.add("4");
list.add("5");
ArrayList list1, list2, list3, list4, list5, list6;
for (int a = 0; a < 6; a++) {
list1 = (ArrayList) list.clone();
str1 = (String) list1.get(a);
for (int b = 0; b < 5; b++) {
list2 = (ArrayList) list1.clone();
list2.remove(a);
str2 = str1 + list2.get(b);
for (int c = 0; c < 4; c++) {
list3 = (ArrayList) list2.clone();
list3.remove(b);
str3 = str2 + list3.get(c);
for (int d = 0; d < 3; d++) {
list4 = (ArrayList) list3.clone();
list4.remove(c);
str4 = str3 + list4.get(d);
for (int e = 0; e < 2; e++) {
list5 = (ArrayList) list4.clone();
list5.remove(d);
str5 = str4 + list5.get(e);
list6 = (ArrayList) list5.clone();
list6.remove(e);
str6 = str5 + list6.get(0);
if (str6.charAt(2) != '4'
&& str6.indexOf("35") == (-1)) {
System.out.println(str6);
}
}
}
}
}
}
}
}
public static void main(String[] args) {
String str1, str2, str3, str4, str5, str6;
ArrayList list = new ArrayList();
list.add("1");
list.add("2");
list.add("2");
list.add("3");
list.add("4");
list.add("5");
ArrayList list1, list2, list3, list4, list5, list6;
for (int a = 0; a < 6; a++) {
list1 = (ArrayList) list.clone();
str1 = (String) list1.get(a);
for (int b = 0; b < 5; b++) {
list2 = (ArrayList) list1.clone();
list2.remove(a);
str2 = str1 + list2.get(b);
for (int c = 0; c < 4; c++) {
list3 = (ArrayList) list2.clone();
list3.remove(b);
str3 = str2 + list3.get(c);
for (int d = 0; d < 3; d++) {
list4 = (ArrayList) list3.clone();
list4.remove(c);
str4 = str3 + list4.get(d);
for (int e = 0; e < 2; e++) {
list5 = (ArrayList) list4.clone();
list5.remove(d);
str5 = str4 + list5.get(e);
list6 = (ArrayList) list5.clone();
list6.remove(e);
str6 = str5 + list6.get(0);
if (str6.charAt(2) != '4'
&& str6.indexOf("35") == (-1)) {
System.out.println(str6);
}
}
}
}
}
}
}
}
private static void Windsorr(String str2, ArrayList list2) {
String str = str2.toString();
ArrayList list = (ArrayList) list2.clone();
if (list.size() == 1) {
str = str + list.get(0);
if (str.charAt(2) != '4' && str.indexOf("35") == (-1)) {
System.out.println(str);
}
} else {
for (int i = 0; i < list.size(); i++) {
str = str + list.get(i);
list.remove(i);
Windsorr(str, list);
str = str2.toString();
list = (ArrayList) list2.clone();
}
}
}public static void main(String[] args) {
String str = "";
ArrayList list = new ArrayList();
list.add("1");
list.add("2");
list.add("2");
list.add("3");
list.add("4");
list.add("5");Windsorr(str, list);
}
}