1. 程式人生 > >2017.09.09網易校招筆試第一題

2017.09.09網易校招筆試第一題

題目忘了,大意是:給你一個長度為n的整形陣列A,你可以對A中的元素進行各種排列組合,看是否存在滿足以下條件的陣列:在該陣列中,A[i]*A[i+1]%4==0,這裡0<=i<=n-1。
資料輸入格式是:第一行,一個整數n,表示陣列的長度;第二行n個整數,表示陣列的所有元素。
如果存在符合條件的陣列,輸出“Yes”,否則輸出“No”。

先上程式碼(我不確定這個程式碼一定完全正確,但是我測試的資料結果都正常,把程式碼放在這裡,主要是希望能有人再給指點指點)
import java.util.Scanner;

/**
 * Created by gentl on 2017/9/9.
*/ public class T { public static void main(String[] args){ Scanner in=new Scanner(System.in); //int testNum=in.nextInt(); while(in.hasNext()){ int n=in.nextInt(); int len=n; int[] arr=new int[n]; for(int i=0;i<n;i++){ arr[i]=in.nextInt(); } boolean
[][] reuslts=new boolean[n][n]; //results陣列用來存放每個元素和其他元素的乘積是否能被4整除 int[] visited =new int[n]; //這裡宣告一個visited陣列,以避免陣列的重複訪問 for(int k=0;k<n;k++){ visited[k]=0; } for(int i=0;i<n;i++) { for (int j = 0; j < n; j++) { if
(i==j)reuslts[i][j]=false; reuslts[i][j] = arr[i] * arr[j] % 4 == 0 ? true : false; } }
            boolean flag=false;		//flag用來表示是有有符合條件的排列組合
            int count=0;		//count用來控制每次迴圈的次數,count到達一定次數時跳出迴圈
            int failed=0;		//failed用來記錄在n次大迴圈之後未成功找到符合條件的排列的次數
            for(int i=0;i<n;i++){	//大迴圈,改迴圈就是對results陣列進行深度優先遍歷,類似於圖的深度優先遍歷(不知道這麼說合不合適)
                for(int k=0;k<n;k++){
                    visited[k]=0;	//每次大迴圈都要將visited陣列置零
                }
                visited[i]=1;		//i表示每次迴圈的起始元素的下標
                int k=i;		//k用來表示每次迴圈內部的遊標
                count=0;		//count置零,為了重新記錄該次迴圈訪問到的元素數
                while(k<n){
                    count++;		//起始元素已經被訪問了,所以加一
                    flag=false;		//
                    for( int j=0;j<n;j++){
                        if(reuslts[k][j]&&visited[j]==0&&k!=j){		//當該元素未被訪問過,可以被4整除,說明該路徑目前合法
                            flag=true;
                            visited[j]=1;
                            k=j;		//k表示下一個要訪問的行
                            break;
                        }
                    }
                    if(!flag){
                        failed++;
                        
                        break;
                    }
                    if(count==n-1){		//這裡count等於n-1即說明此行遍歷結束
                       
                        break;
                    }
            
                }
                if(count==n-1&&flag){
                    System.out.println("Yes");
                    break;
                }
            }
            if(failed==len){
                System.out.println("No");
            }
        }
    }
}