One of Ali's 2018 interview questions

1 Question: Find a 9-digit number. This number is composed of 1,2,3,4,5,6,7,8,9, and the numbers cannot be repeated, so that the first digit of this number can be divisible by 1. The first two The number of digits is divisible by 2, the first three digits are divisible by 3, and so on until the entire nine digits are divisible by 9.

2 Problem-solving ideas:
Idea 1: Violent solution, cycle from 1123456789 to 999999999, respectively calculate whether the first 2 digits can be divisible by 2, whether the first 3 digits can be divisible by 3... If it can continue, if not, exit and enter the next cycle ; I feel that this method is too inefficient.
Idea 2: Use 1 to 9 numbers to form an array {1, 2, 3, 4, 5, 6, 7, 8, 9}, take out elements from the array respectively, and form 1-digit and 2-digit numbers that meet the needs ...9 digits, and carry out circular matching, and finally get the required number; the author uses this method to solve it, and attaches the code.
Idea 3: According to some mathematical common sense, reasoning, such as divisibility by 2, divisibility by 3 and so on, reasoning, and finally calculate the result.

3 java code

import java.util.Arrays;

public class UniqueSolution {
    
    
    static boolean pr=false;//true  打印测试日志
    public static void main(String[] args){
    
    
        int[] arrayInt={
    
    1,2,3,4,5,6,7,8,9};
        int resultNum=computerUniqueNumber(arrayInt);
        if (Integer.valueOf(resultNum).equals(0)){
    
    
            System.out.println("未找到题目所要求的数");
        }  else System.out.println("题目的答案是:" + resultNum);
    }
    static int computerUniqueNumber(int[] arrayInt){
    
    
        int times=0;//用于记录循环次数
        int[] newArray=arrayInt.clone();//用做数组中转
        int sizeNewArray=newArray.length; //中转数组长度
        int iLoop=sizeNewArray;//循环次数
        int[] iArray=newArray.clone();//循环数组
        int resultNum=0;//用于记录所求数字
        for (int i=0;i<iLoop;i++){
    
    
            times++;
            if (pr) {
    
    
                System.out.println("**********************************");
            }
            if (pr) {
    
    
                System.out.println("i:" + i);
            }
            iArray=arrayInt.clone();
            //前一位数
            int[] arrayFront1 = new int[1];
            arrayFront1[0]=iArray[i];
            int intFront1 = arrayToInt(arrayFront1);
            int modFront1=intFront1%1;
            if (modFront1==0){
    
    
                if (pr) {
    
    
                    System.out.println("intFront1:" + intFront1);
                }
                //清除第一个数字
                iArray[i]=0;//用过的数字置为0,做标记;
                newArray=arrayDeleteZero(iArray);//剔除0元素,生成新的数组
                iArray=newArray;//赋新值,清除0,供下一级循环使用
                sizeNewArray=newArray.length;//剔除非0元素后数组的长度
                if (pr) {
    
    
                    System.out.println("newArray:" + Arrays.toString(newArray));
                }
                if (pr) {
    
    
                    System.out.println("sizeNewArray:" + sizeNewArray);
                }
                int jLoop=sizeNewArray;
                int[] jArray=iArray.clone();
                for (int j=0;j<jLoop;j++){
    
    
                    times++;
                    if (pr) {
    
    
                        System.out.println("j:" + j);
                    }
                    jArray=iArray.clone();
                    //前二位数
                    int[] arrayFront2=new int[2];
                    arrayFront2=arrayNext(arrayFront1,2,jArray[j]);
                    int intFront2=arrayToInt(arrayFront2);
                    int modFront2=intFront2%2;
                    if  (modFront2==0){
    
    
                        if (pr) {
    
    
                            System.out.println("intFront2:" + intFront2);
                        }
                        //清除第二个数字
                        jArray[j]=0;
                        newArray=arrayDeleteZero(jArray);
                        jArray=newArray;
                        sizeNewArray=newArray.length;
                        if (pr) {
    
    
                            System.out.println("newArray:" + Arrays.toString(newArray));
                        }
                        if (pr) {
    
    
                            System.out.println("sizeNewArray:" + sizeNewArray);
                        }

                        int kLoop=sizeNewArray;
                        int[] kArray=newArray.clone();
                        for (int k=0;k<kLoop;k++) {
    
    
                            times++;
                            if (pr) {
    
    
                                System.out.println("k:" + k);
                            }
                            kArray=jArray.clone();
                            //前三位数
                            int[] arrayFront3 = new int[3];
                            arrayFront3=arrayNext(arrayFront2,3,kArray[k]);
                            int intFront3 = arrayToInt(arrayFront3);
                            int modFront3=intFront3%3;
                            if  (modFront3==0){
    
    
                                if (pr) {
    
    
                                    System.out.println("intFront3:" + intFront3);
                                }
                                //清除第三个数字
                                kArray[k]=0;
                                newArray=arrayDeleteZero(kArray);
                                kArray=newArray;
                                sizeNewArray=newArray.length;
                                if (pr) {
    
    
                                    System.out.println("newArray:" + Arrays.toString(newArray));
                                }
                                if (pr) {
    
    
                                    System.out.println("sizeNewArray:" + sizeNewArray);
                                }
                                int lLoop=sizeNewArray;
                                int[] lArray=newArray.clone();
                                for (int l=0;l<lLoop;l++) {
    
    
                                    times++;
                                    if (pr) {
    
    
                                        System.out.println("l:" + l);
                                    }
                                    lArray=kArray.clone();
                                    //前四位数
                                    int[] arrayFront4 = new int[4];
                                    arrayFront4=arrayNext(arrayFront3,4,lArray[l]);
                                    int intFront4 = arrayToInt(arrayFront4);
                                    int modFront4 = intFront4 % 4;
                                    if (modFront4 == 0) {
    
    
                                        if (pr) {
    
    
                                            System.out.println("intFront4:" + intFront4);
                                        }
                                        //清除第四个数字
                                        lArray[l]=0;
                                        newArray=arrayDeleteZero(lArray);
                                        lArray=newArray;
                                        sizeNewArray=newArray.length;
                                        if (pr) {
    
    
                                            System.out.println("newArray:" + Arrays.toString(newArray));
                                        }
                                        if (pr) {
    
    
                                            System.out.println("sizeNewArray:" + sizeNewArray);
                                        }
                                        int mLoop=sizeNewArray;
                                        int[] mArray=newArray.clone();
                                        for (int m=0;m<mLoop;m++) {
    
    
                                            times++;

                                            if (pr) {
    
    
                                                System.out.println("m:" + m);
                                            }
                                            mArray=lArray.clone();
                                            //前五位数
                                            int[] arrayFront5 = new int[5];
                                            arrayFront5=arrayNext(arrayFront4,5,mArray[m]);
                                            int intFront5 = arrayToInt(arrayFront5);
                                            int modFront5 = intFront5 % 5;
                                            if (modFront5 == 0) {
    
    
                                                if (pr) {
    
    
                                                    System.out.println("intFront5:" + intFront5);
                                                }
                                                //清除第五个数字
                                                mArray[m] = 0;
                                                newArray = arrayDeleteZero(mArray);
                                                mArray=newArray;
                                                sizeNewArray = newArray.length;
                                                if (pr) {
    
    
                                                    System.out.println("newArray:" + Arrays.toString(newArray));
                                                }
                                                if (pr) {
    
    
                                                    System.out.println("sizeNewArray:" + sizeNewArray);
                                                }
                                                int nLoop=sizeNewArray;
                                                int[] nArray=newArray.clone();
                                                for (int n=0;n<nLoop;n++) {
    
    
                                                    times++;
                                                    if (pr) {
    
    
                                                        System.out.println("n:" + n);
                                                    }
                                                    nArray=mArray.clone();
                                                    前六位数
                                                    int[] arrayFront6 = new int[6];
                                                    arrayFront6=arrayNext(arrayFront5,6,nArray[n]);
                                                    int intFront6 = arrayToInt(arrayFront6);
                                                    int modFront6 = intFront6 % 6;
                                                    if (modFront6 == 0) {
    
    
                                                        if (pr) {
    
    
                                                            System.out.println("intFront6:" + intFront6);
                                                        }
                                                        //清除第六个数字
                                                        nArray[n] = 0;
                                                        newArray = arrayDeleteZero(nArray);
                                                        nArray=newArray;
                                                        sizeNewArray = newArray.length;
                                                        if (pr) {
    
    
                                                            System.out.println("newArray:" + Arrays.toString(newArray));
                                                        }
                                                        if (pr) {
    
    
                                                            System.out.println("sizeNewArray:" + sizeNewArray);
                                                        }
                                                        int oLoop=sizeNewArray;
                                                        int[] oArray=newArray.clone();
                                                        for (int o=0;o<oLoop;o++) {
    
    
                                                            times++;
                                                            if (pr) {
    
    
                                                                System.out.println("o:" + o);
                                                            }
                                                            oArray=nArray.clone();
                                                            //前七位数
                                                            int[] arrayFront7 = new int[7];
                                                            arrayFront7=arrayNext(arrayFront6,7,oArray[o]);
                                                            int intFront7 = arrayToInt(arrayFront7);
                                                            int modFront7 = intFront7 % 7;
                                                            if (modFront7 == 0) {
    
    
                                                                if (pr) {
    
    
                                                                    System.out.println("intFront7:" + intFront7);
                                                                }
                                                                //清除第七个数字
                                                                oArray[o] = 0;
                                                                newArray = arrayDeleteZero(oArray);
                                                                oArray=newArray;
                                                                sizeNewArray = newArray.length;
                                                                if (pr) {
    
    
                                                                    System.out.println("newArray:" + Arrays.toString(newArray));
                                                                }
                                                                if (pr) {
    
    
                                                                    System.out.println("sizeNewArray:" + sizeNewArray);
                                                                }
                                                                int pLoop=sizeNewArray;
                                                                int[] pArray=newArray.clone();
                                                                for (int p=0;p<pLoop;p++) {
    
    
                                                                    times++;
                                                                    if (pr) {
    
    
                                                                        System.out.println("p:" + p);
                                                                    }
                                                                    pArray=oArray.clone();
                                                                    //前八位数
                                                                    int[] arrayFront8 = new int[8];
                                                                    arrayFront8=arrayNext(arrayFront7,8,pArray[p]);
                                                                    int intFront8 = arrayToInt(arrayFront8);
                                                                    int modFront8 = intFront8 % 8;
                                                                    if (modFront8 == 0) {
    
    
                                                                        if (pr) {
    
    
                                                                            System.out.println("intFront8:" + intFront8);
                                                                        }
                                                                        //清除第八个数字
                                                                        pArray[p] = 0;
                                                                        newArray = arrayDeleteZero(pArray);
                                                                        pArray=newArray;
                                                                        sizeNewArray = newArray.length;
                                                                        if (pr) {
    
    
                                                                            System.out.println("newArray:" + Arrays.toString(newArray));
                                                                        }
                                                                        if (pr) {
    
    
                                                                            System.out.println("sizeNewArray:" + sizeNewArray);
                                                                        }
                                                                        int qLoop=sizeNewArray;
                                                                        int[] qArray=newArray.clone();
                                                                        for (int q=0;q<qLoop;q++) {
    
    
                                                                            times++;
                                                                            if (pr) {
    
    
                                                                                System.out.println("q:" + q);
                                                                            }
                                                                            qArray=pArray.clone();
                                                                            //前九位数
                                                                            int[] arrayFront9 = new int[9];
                                                                            arrayFront9=arrayNext(arrayFront8,9,qArray[q]);
                                                                            int intFront9 = arrayToInt(arrayFront9);
                                                                            int modFront9 = intFront9 % 9;
                                                                            if (modFront9 == 0) {
    
    
                                                                                resultNum=intFront9;
                                                                                if (pr) {
    
    
                                                                                    System.out.println("newArray:" + Arrays.toString(newArray));
                                                                                }
                                                                                if (pr) {
    
    
                                                                                    System.out.println("sizeNewArray:" + sizeNewArray);
                                                                                }
                                                                            }//if q  modFront9
                                                                        } //for q
                                                                    }//if p modFront8
                                                                } //for p
                                                            }//if o  modFront7
                                                        } //for o
                                                    }//if n  modFront6
                                                } //for n
                                            }//if m  modFront5
                                        } //for m
                                    }//if  l  modFront4
                                } // for l
                            } //if  modFront3
                        }// for k
                    }//if modFront2
                }//for j
            }// if  modFront1
        }//for i

        System.out.println("循环的次数:"+times);
        return resultNum;

    }

    //数组转数字
    static int arrayToInt(int[] arrayInt){
    
    
        String strNum="";
        for (int num : arrayInt) {
    
    
            strNum=strNum+Integer.toString(num);
        }
        int intNum=Integer.parseInt(strNum);
        return intNum;
    }
    //剔除非零元素,生成新的数组
    static int[] arrayDeleteZero(int[] arrayInt){
    
    
        int i=0;
        int sizeArrayInt=arrayInt.length;
        for (int num : arrayInt) {
    
    
            if (num==0){
    
    
                i++;
            }
        }
        //计算新数组长度
        int sizeArrayIntNew=sizeArrayInt-i;
        int[] arrayIntNew=new int[sizeArrayIntNew];
        int j=0;
        for (int k=0;k<sizeArrayInt;k++){
    
    
            if (arrayInt[k]==0){
    
    
                j++;
            } else {
    
    
                arrayIntNew[k-j]=arrayInt[k];
            }
        }
        return arrayIntNew;
    }
    //生成下一个数组
    static int[] arrayNext(int[] arrayPrior,int sizeNextArray,int num){
    
    
        int[] nextArray=new int[sizeNextArray];
        for (int i=0;i<arrayPrior.length;i++){
    
    
            nextArray[i]=arrayPrior[i];
        }
        nextArray[sizeNextArray-1]=num;
        return nextArray;
    }

}

4 running results
insert image description here

Guess you like

Origin blog.csdn.net/helloworldchina/article/details/105749787