【面试程序】输出排列组合的数字

***************************************
题目:
输出所有的组合用1,2,3,4,5组合的数字

想法:递归,先挑选出一个数字,然后,剩下的继续进行组合。
直到只剩下两个数字的时候,交换,输出。

代码:
private void wapOut(String change,String stati){
         if (change.length() == 2){
             String temp = String.valueOf(stati);
             System.out.println(temp+change);
             System.out.println(temp+change.charAt(1)+change.charAt(0));
         }else{
             for(int i=0; i<change.length(); i++){
                 String temp = change.substring(0,i)+change.substring(i+1,change.length());
                 wapOut(temp,stati+change.substring(i,i+1));
             }
         }
     }

测试:
wapOut("1234",""),输出24个数字
wapOut("12345",""),输出120个数字
***************************************
题目:
用1,2,2,3,4,5,这六个数字,用java写一个main函数,打印出所有不同的排列,如:512234,212345等,
要求:“4”不能排第3位,“1”与“5”不能相连。

思路:先输出所有的组合,然后剔除其中的不符合要求的.

代码:
int num[] = {1, 2, 2, 3, 4, 5};
     int total = 0;

     private void wapB() {
         int len = num.length;
         for (int i0 = 0; i0 < len; i0++) {
             for (int i1 = 0; i1 < len; i1++) {
                 for (int i2 = 0; i2 < len; i2++) {
                     for (int i3 = 0; i3 < len; i3++) {
                         for (int i4 = 0; i4 < len; i4++) {
                             for (int i5 = 0; i5 < len; i5++) {
                                 int n[] = new int[]{i0,i1,i2,i3,i4,i5};
                                 if (Same(n) || RepeatOf2(n) || ThirdOf4(n) || Separate15(n)){
                                     continue;
                                 }
                                 GetNum(n);
                             }
                         }
                     }
                 }
             }
         }
     }
    
     //有数字重复,例如11111
     boolean Same(int []n){
         for (int i=0; i<n.length; i++){
             for(int j=i+1; j<n.length; j++){
                 if (n[i] == n[j]){
                     return true;
                 }
             }
         }
         return false;
     }
    
     //因为有两个2,所以要减少一次重复 比如 122345 和 122345
     boolean RepeatOf2(int []n){
         for (int i=0; i<n.length; i++){
             for(int j=i+1; j<n.length; j++){
                 if ((num[n[i]] == num[n[j]]) && (num[n[i]] == 2) && (n[i]>n[j])){
                     return true;
                 }
             }
         }
         return false;
     }
    
     //要求
     boolean ThirdOf4(int []n){
         if (num[n[3]] == 4){
             return true;
         }
         return false;
     }
    
     //要求
     boolean Separate15(int []n){
         for (int i=0; i<n.length; i++){
            for(int j=i+1; j<n.length; j++){
                if ((num[n[i]] == 1 && num[n[i+1]] == 5) || (num[n[i]] == 5 && num[n[i+1]] == 1)){
                    return true;
                }
            }
        }

         return false;
     }
    
     String GetNum(int[] n){
         String temp = "";
         for (int i=0; i<n.length; i++){
             temp += String.valueOf(num[n[i]]);
         }
         total++;
         System.out.println(temp);
         return temp;
     }

测试:
结果是198,符合.

 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值