您的位置:首页 > 职场人生

面试算法---排列组合AC的实现

2015-05-20 09:55 453 查看
一:基础知识

1.排列公式Anm是指从n个元素取m个进行排列(即排序).

操作步骤:先从n个元素中选取m个元素,再进行排序.(一共有Anm种排列)
2.组合公式Cnm是指从n个元素取m个不进行排列(即不排序)
操作步骤:只需从n个元素中选取m个元素就好,不须要排序.(一共有Cnm中取法)
3.例如 从A、B、C 3个字母取2个字母进行排列,有6种:AB AC BA BC CA CB 
(字母顺序不同,是不同的排列)
而将A、B、C 3个字母取2个字母进行组合,只有3种:AB AC BC(只与含有的元素有关,与顺序无关,即AB与BA是同种组合)

或移步摆渡---例题很经典,可以研究一下。。。。

A(n,m)=n(n-1)(n-2)……(n-m+1)= n!/(n-m)!

C(n,m)=A(n,m)/m!;C(n,m)=C(n,n-m)

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
* @author MohnSnow
* @time 2015年5月20日 上午10:39:17
*
*/
public class Test {
//将NUM设置为待排列数组的长度即实现全排列
private static int NUM = 3;
private static int ACCOUNT = 0;
/**
* 递归算法:将数据分为两部分,递归将数据从左侧移右侧实现全排列,类似于DFS算法
*
* @param datas
* @param target
*/
private static void sort(List datas, List target) {
if (target.size() == NUM) {
for (Object obj : target)
System.out.print(obj);
System.out.print(" "+ ++ACCOUNT );
System.out.println();
return;//退出此次循环
}
for (int i = 0; i < datas.size(); i++) {
List newDatas = new ArrayList(datas);
List newTarget = new ArrayList(target);
newTarget.add(newDatas.get(i));
newDatas.remove(i);
System.out.println("newDatas:"+newDatas);
System.out.println("newTarget:"+newTarget);
System.out.println("循环一次,此时i值为"+i);
sort(newDatas, newTarget);
}
}
public static void main(String[] args) {
String[] datas = new String[] { "a", "b", "c", "d" };
System.out.println("字符为:"+Arrays.asList(datas)+",选择字符个数为:"+NUM);
//System.out.println(datas);
sort(Arrays.asList(datas), new ArrayList());
}
}

/**
* @author MohnSnow
* @time 2015年5月20日 上午11:31:45
* @title 只是int范围的时候
*/
import java.io.*;
import java.util.Arrays;
import java.util.Scanner;
public class Test_A {

/**
* @param args
*/

private static int A(int a,int b){
int A_return = 1,i;
int c = a-b+1;
for(i = c;i <= a;i++){
A_return *=i;
}
return A_return;
}
private static int C(int a,int b){
if(b>a/2){
int a_temp = a;
int temp = a-b;
C(a_temp,temp);
}
int C_return = 1,up_temp =1,down_temp=1;
for(int i = 1;i <= b;i++){
up_temp   *= a--;
down_temp *= i;
//System.out.println(""+up_temp);
}
C_return = up_temp/down_temp;
return C_return;
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int a_input = in.nextInt();
int b_input = in.nextInt();
System.out.println("A(a,b):"+A(a_input,b_input)+",C(a,b):"+C(a_input,b_input));
}
}


/**
* @author MohnSnow
* @time 2015年5月20日 上午11:31:45
* @title 不只是int范围的时候
*/
import java.io.*;
import java.math.BigInteger;
import java.util.Arrays;
import java.util.Scanner;
public class TestBigInteger {

/**
* @param args
*/

private static BigInteger A(BigInteger a,BigInteger b){
BigInteger A_return = BigInteger.ONE;
//System.out.println(A_return);
BigInteger c = a.subtract(b).add(BigInteger.ONE);//c= a-b+1
//System.out.println(c);
for(BigInteger i = c;i.compareTo(a) ==0 || i.compareTo(a) == -1;i = i.add(BigInteger.ONE)){
//System.out.println(i);
A_return = A_return.multiply(i);
}
return A_return;
}
private static BigInteger C(BigInteger a,BigInteger b){
BigInteger two = new BigInteger("2");
if(b.compareTo(a.divide(two)) == 1){// b>a/2
//System.out.println("b > a/2");
BigInteger a_temp = a;
BigInteger temp = a.subtract(b);//a-b
//System.out.println("a-b = "+temp);
return C(a_temp,temp);
}
BigInteger C_return = BigInteger.ONE,
up_temp =BigInteger.ONE,
down_temp=BigInteger.ONE;
for(BigInteger i = BigInteger.ONE;i.compareTo(b) != 1;a = a.subtract(BigInteger.ONE),i = i.add(BigInteger.ONE)){
up_temp = up_temp.multiply(a);
down_temp = down_temp.multiply(i);
System.out.println(i + "a: "+a+"----"+"i: "+i);
}
C_return = up_temp.divide(down_temp);
return C_return;
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
BigInteger a_input = in.nextBigInteger();
BigInteger b_input = in.nextBigInteger();
System.out.println("A(a,b):"+A(a_input,b_input)+",C(a,b):"+C(a_input,b_input));
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: