2017.09.09網易校招筆試第一題
阿新 • • 發佈:2018-12-30
題目忘了,大意是:給你一個長度為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"); } } } }