今天面试遇到这个笔试题,大家看看该怎么做?
给定一个数组比如:int[] arr = {1,3,2};
全排列,把所有的组合打印出来
结果就是:
123
132
213
231
......

解决方案 »

  1.   

    http://www.blogjava.net/SongJunke/archive/2007/03/25/101741.html
      

  2.   

    是实现任意的int[]型数组?还是就是 int[] arr = {1,2,3}?
      

  3.   

    7楼,这题是实现任意的int型数组。int[] arr = {1,2,3}只是个比喻
      

  4.   

    public class Test {
    public static void main(String[] args){
    int[] a={1,2,3};
    int length=a.length;
    for(int i=0;i<length;i++){
    for(int j=0;j<length;j++){
    if(j==i)
    continue;
    for(int k=0;k<length;k++){
    if(k==j || k==i)
    continue;
    System.out.println(""+a[i]+a[j]+a[k]);
    }
    }
    }
    }
    }
      

  5.   

    //将12345中取5个,并进行全排列,也就是整个字符串全排列,如果每次只取2个进行全排列,可以吧5改为2
    public class AllLinage
    { public static void main(String[] args)
    {
    rank("12345", "", 5);
    }

    public static void rank(String s, String result, int len)
    {
    if(result.length() == len)
    {
    System.out.println(result);
    }
    else
    {
    for(int i = 0; i < s.length(); i++)
    {
    if(result.indexOf(s.charAt(i)) < 0)
    rank(s, result + s.charAt(i), len);
    }
    }
    }}
      

  6.   

    你这个题目本身要考虑int[]中有重复的情况,我不明白该怎么写,哪位高手解答下。
      

  7.   

    这是小弟刚刚做出来的,还是热乎乎的呢,用HashSet解决了数组中有重复元素的情况,应该符合要求了。
    /**
     * @author yinian
     *
     */import java.util.Set;
    import java.util.HashSet;public class Test { /**
     * @param args
     */

    public static void main(String[] args)
        {
    int[] a = {1, 3, 1, 4, 5};
    String str = toOrderString(a); /* 将数组的下标值加1组成一个无重复的新数组,如本例为{1, 2, 3, 4, 5} */
    Set<String> tempSet = rank(str, "", str.length(), new HashSet<String>()); /* 对下标值加1所组成的数组进行完全排列组合,若只需取部分组合,则将str.length()改为介于0和str.length()之间的任一整数就可以了 */
            Set<String> resultSet = getResult(tempSet, a); /* 将排列组合好的各组下标序列值在数组中取相应的元素值 */
            System.out.println("There are " + resultSet.size() + " ways to rank the array.");
            for (String string : resultSet) {
             System.out.println(string);
            }
       }

    /* 用递归方法对数组的各元素下标值加1进行长度为length的完全排列组合 */
        public static Set<String> rank(String s, String temp, int length, Set<String> set)
        {
            if(temp.length() == length)
            {
                set.add(temp);
            }
            else
            {
                for(int i = 0; i < s.length(); i++)
                {
                    if(temp.indexOf(s.charAt(i)) < 0)
                        set = rank(s, temp + s.charAt(i), length, set);
                }
            }
            return set;
        }
        
        public static String toOrderString(int[] a) {
         String str = new String("");
         for (int i = 0; i < a.length; i++) {
         str += (i + 1);
         }
         return str;
        }
        
        /* 将排列组合好的各组下标序列值在数组中取相应的元素值 */
        public static Set<String> getResult(Set<String> set, int[] a) {
         Set<String> tempSet = new HashSet<String>();
         String tempStr = new String("");
         for (String str : set) {
         for (int i = 0; i < str.length(); i++) {
             tempStr += a[Integer.parseInt(str.substring(i, i + 1)) - 1];
             }
         tempSet.add(tempStr);
         tempStr = "";
            }    
         return tempSet;
        }
        
        public static String toString(int[] a) {
         String str = new String("");
         for (int i = 0; i < a.length; i++) {
         str += a[i];
         }
         return str;
        }}输出结果为:There are 60 ways to rank the array.
    41531
    41153
    14513
    11543
    34115
    ……(这里不全部列出来了)