当前位置: 代码迷 >> J2SE >> 数组装N个元素,取R次,打印所有排列。求算法,该怎么处理
  详细解决方案

数组装N个元素,取R次,打印所有排列。求算法,该怎么处理

热度:218   发布时间:2016-04-24 01:31:29.0
数组装N个元素,取R次,打印所有排列。求算法
笔试没弄出来,求解一下...
一个一维数组,里面有N个元素,从里面去R次,打印取出来的数的排列组合。取出顺序不管。
例如:[1,2,3] 取两次
可能取出的情况打印下来就是
1,2
2,3
1,3
求这个算法一下...
谢谢了,找工作不容易啊。

------解决方案--------------------
Java code
public class Test {        public static void main(String[] args) {        int[] arr = new int[] { 1, 3, 5, 7, 9 };        get(arr, 2);    }    public static void get(int[] a, int n) {        if (n > a.length || n == 0) {            return;        }        for (int i = n - 1; i < a.length; i++) {            for (int j = 0; j < n - 1; j++) {                System.out.print(a[j] + " ");            }            System.out.print(a[i] + "\n");        }        if (a.length - 1 < n || n == 1) {            return;        }        int[] b = new int[a.length - 1];        for (int i = 0; i < b.length; i++) {            if (i == 0 && n != 2) {                b[i] = a[i];            } else {                b[i] = a[i + 1];            }        }        get(b, n);    }}
------解决方案--------------------
Java code
import java.util.Random;public class Combination{        int[] array={1,2,3};    MyLinkedList newArray;    boolean[] flags;    int Cishu = 2;        public Combination(int number){        flags = new boolean[array.length];        for(int i=0;i<array.length;i++){            flags[i] = false;//表示该元素未取出        }        newArray = new MyLinkedList();        this.Cishu = number;    }    public Combination(int[] array,int number){        this.array = array;        flags = new boolean[array.length];        for(int i=0;i<array.length;i++){            flags[i] = false;//表示该元素未取出        }        newArray = new MyLinkedList();        this.Cishu = number;    }        public void getElement(){        Random rd = new Random();        int number = Math.abs(rd.nextInt()%array.length);        while(flags[number]){//如果该数已经取出来了,丢弃,重取            number = Math.abs(rd.nextInt()%array.length);        }        newArray.addElement(array[number]);        flags[number] = true;    }    public void print(){        for(int i=0;i<Cishu;i++){            getElement();        }        Node node = newArray.head;        while(node!=null){            System.out.print(node.in+"|");            node = node.next;        }    }    public static void main(String args[]){                new Combination(2).print();            }}class MyLinkedList{    Node head;    Node tail;        public void addElement(Integer in){        if(head==null){            Node node = new Node(in);            head = node;            tail = node;            return;        }        if(head.in > in){            Node node = new Node(in);            head.prev = node;            node.next = head;            head = node;            return;        }        Node zhizhen = head.next;        while(zhizhen != null){            if(zhizhen.in > in){//从小到大排序。                Node node = new Node(in);                zhizhen.prev.next = node;                node.prev = zhizhen.prev;                node.next = zhizhen;                zhizhen.prev = node;                return;            }            zhizhen = zhizhen.next;        }        Node node = new Node(in);//循环都没找到,说明是最大的        tail.next = node;        node.prev = tail;        tail = node;    }}class Node{//    Integer in;    Node next =null;//后向指针    Node prev = null;//前向指针    public Node(){            }    public Node(Integer in){        this.in = in;        this.next=null;        this.prev=null;    }}
------解决方案--------------------
for example
Java code
public class Test {    public static void main(String[] args) {        combine(new int[]{1,2,3,4,5}, 3);    }    public static void combine(int[] a, int n) {        if (n > a.length) {            for (int i : a) {                System.out.printf("%d ", i);            }            return;        }        int idx=0, t=0, p=(int)Math.pow(2, a.length);        while (p > 0) {            if (Integer.bitCount(p) == n) {                t = p;                idx = 0;                while (t > 0) {                    if (t%2==1) {                        System.out.printf("%d ", a[idx]);                    }                    t >>= 1;                    idx++;                }                System.out.println();            }            p--;        }    }}
  相关解决方案