天天看點

用1、2、2、3、4、5 這六個數字,用java 寫一個main 函數,列印出所有不同的排列,要求:"4"不能在第三位,"3"與"5"不能相連。

下面的代碼是網上找的,我按照自己的了解加的注釋:

public class test01 {
    public static void main(String[] args) {
    // 理論上,題目所要求的排列組成的數字,都包含在122345~543221之間,是以外層循環控制數值周遊
        for(int i=;i<=;i++){
            // 将數字i轉換成char類型的數組s,例如當i=122345時,s[]={'1','2','2','3','4','5'}
            char s[]=new Integer(i).toString().toCharArray();
            // 聲明變量s1,s2,s3,s4,s5,flag作為判斷依據,并設定初始值         
            int s1=;
            int s2=;
            int s3=;
            int s4=;
            int s5=;
            boolean flag=true;
            // 聲明變量j作為數組s中的元素的下标(index)
            for(int j=;j<s.length;j++){
                // 判斷數組s中的元素是否包含在{'1','2','3','4','5'}中,是則對應的s1,s2,s3,s4,s5加1
                // 其中s1代表元素'1'在目前數組s中出現的次數,s2,s3,s4,s5同理
                if(s[j]=='1'){s1++;}
                if(s[j]=='2'){s2++;}
                if(s[j]=='3'){s3++;}
                if(s[j]=='4'){s4++;}
                if(s[j]=='5'){s5++;}
                // 判斷'3'與'5'是否相連,是則不符合題目要求,flag傳回false
                if(j!=s.length-){
                    if(s[j]=='3'&&s[j+]=='5'||s[j]=='5'&&s[j+]=='3'){flag=false;}
                }
            }
            // 判斷數組s中第三位的元素是否為'4',是則不符合題目要求,flag傳回false
            if(s[]=='4'){
                flag=false;
            }
            // 判斷目前數值i是否符合題目所要求的排列,是則輸出i
            if(s1==&&s2==&&s3==&&s4==&&s5==&&flag){
                System.out.println(i);
            }
        }
    }