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");
            }
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_15720911/article/details/77934267