前几天参加面试,其中有一道排列组合题,大意是要求用java语言编写程序,输出数字1,2,2,3,4,5的所有可能的排列组合,而且4不能在第三位,3和5不能相邻,例如122345是正确的,12435是错误的。参考答案 http://www.jfox.info/java-pai-lie-shu-zi-zu-he-mian-shi-tiJava面试题面试
解决方案 »
- 大神们 帮看看这个是啥意思
- 请教 Ant 外部文件的使用
- 刚学的菜鸟求教
- jquery tree怎么用
- Struts2+Hibernate+Spring整合,有人懂没,真的没有一个人懂吗
- cxf集成spring在tomcat5.5发布时候的问题
- 各位路过的大哥,帮小弟个忙,有分贡上。。。。。
- 哪里有实现了XAResource的JDBC Driver源代码?
- 在hibernate中,用Middlegen-Hibernate来实现对数据库中表的映射的问题???
- 请问j2sdk1.4带的JDBC是不是2.0的?我在doc中找不到关于连接池的类
- Java连接Oracle调用存储过程提示实际返回的行数超出请求的行数异常,怎么解决,请教各位大侠帮忙?
- float 类型的属性存储时变成科学计数法, 在mysql数据库中如何查询
import java.util.List;
public class CombinationTest
{ //数组长度
public static final int LENTH = 6; public static void main(String[] args)
{
char[] values = {'1', '2', '2', '3', '4', '5'}; List<String> result = getCombinations(values); System.out.println("排列组合总数:" + result.size());
System.out.println("符合要求的排列如下:");
for (String str : result)
{
System.out.println(str);
}
} /**
* 获取排列的方法
* @param values
* @return
*/
private static List<String> getCombinations(char[] values)
{
List<String> result = new ArrayList<String>(); //递归排序
int lenth = values.length;
//循环开头;递归方法调用前,基本数据准备
for (int i = 0; i < lenth; i++)
{
//以此为排列第一个字符
String headStr = String.valueOf(values[i]); //将当前字符去掉得到一个新的数组
char[] temp = removeIndexArray(values, i); processList(headStr, temp, result);
} return result;
} /**
* 核心递归方法
* @param headStr
* @param temp
* @param result
*/
private static void processList(String headStr, char[] temp, List<String> result)
{
int lenth = temp.length;
if (lenth == 0)
{
return;
} //递归收敛处
if (lenth == 1)
{
String strTmp = headStr + temp[0]; //校验规则
processStr(strTmp, result);
return;
} for (int i = 0; i < lenth; i++)
{
//拼装字符串
String strTmp = headStr + temp[i];
//将当前字符去掉得到一个新的数组
char[] temp2 = removeIndexArray(temp, i); //递归调用
processList(strTmp, temp2, result);
}
} /**
* 字符串合法性校验
* @param strTmp
* @param result
*/
private static void processStr(String strTmp, List<String> result)
{
//4不能在第三位,3和5不能相邻
if (result.contains(strTmp) || strTmp.length() < LENTH || strTmp.charAt(2) == '4'
|| Math.abs(strTmp.indexOf("3") - strTmp.indexOf("5")) == 1)
{
return;
} result.add(strTmp);
} /**
* 去掉指定下标字符,构成新数组
* @param values
* @param index
* @return
*/
private static char[] removeIndexArray(char[] values, int index)
{
char[] charArray = new char[values.length - 1];
int index2 = 0;
for (int i = 0; i < values.length; i++)
{
if (i == index)
{
continue;
}
charArray[index2++] = values[i];
}
return charArray;
}
}