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

一:基础知识

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));
	}
}












你可能感兴趣的:(算法分析与设计)