某IT公司的笔试题:将122345这六个数字全排列,要求4不能在第三位,3和5不能在一起,要求计算出所有的排列方式。
现在将这道题目的Java实现解答如下:
public class NumArray {
public static void main(String[] args) {
long date1 = System.currentTimeMillis();
List list = count("123456");
List newList = new ArrayList();
String outPutStr = "";
int i = -1;
while (i < list.size()) {
i++;
if (i == list.size())
break;
int firstAppear2 = list.get(i).toString().indexOf('2');
int firstAppear3 = list.get(i).toString().indexOf('3');
int firstAppear5 = list.get(i).toString().indexOf('5');
int firstAppear4 = list.get(i).toString().indexOf('4');
int firstAppear6 = list.get(i).toString().indexOf('6');
if (firstAppear2 > firstAppear6)
continue;
else if (firstAppear3 - firstAppear5 == 1 || firstAppear3 - firstAppear5 == -1)
continue;
else if (firstAppear4 == 2)
continue;
else
newList.add(list.get(i));
}
for (int j = 0; j < newList.size(); j++) {
outPutStr = newList.get(j).toString().replace('6', '2');
System.out.println(outPutStr);
}
System.out.println("Process complete!Get " + newList.size() + " strings ");
System.out.print("it takes " + (System.currentTimeMillis() - date1) + " ms");
}
public static List count(String strData) {
List list = new ArrayList();
if (strData.length() < 2) {
list.add(strData);
return list;
} else if (strData.length() == 2) {
String str1 = strData.substring(0, 1);
String str2 = strData.substring(1);
list.add(strData);
list.add(str2 + str1);
} else {
for (int i = 0; i < strData.length(); i++) {
String strTmp = strData.substring(i, i + 1);
List listTmp = count(strData.substring(0, i) + strData.substring(i + 1, strData.length()));
for (int j = 0; j < listTmp.size(); j++) {
list.add(strTmp + listTmp.get(j).toString());
}
}
}
return list;
}
}
共有198种排序方法。