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

来源:互联网 发布:淘宝如何自动发货 编辑:程序博客网 时间:2024/05/18 17:44

一:基础知识

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












0 0
原创粉丝点击